Вызов рукописного ядра CUDA с помощью тяги

StackOverflow https://stackoverflow.com/questions/2398031

  •  25-09-2019
  •  | 
  •  

Вопрос

поскольку мне нужно было сортировать большие массивы чисел с помощью CUDA, я решил использовать тягу.Пока все хорошо... но что, если я захочу вызвать «рукописное» ядро, имеющее объект chunk::host_vector, содержащий данные?

Мой подход был (резервная копия отсутствует):

int CUDA_CountAndAdd_Kernel(thrust::host_vector<float> *samples, thrust::host_vector<int> *counts, int n) {

 thrust::device_ptr<float> dSamples = thrust::device_malloc<float>(n);
 thrust::copy(samples->begin(), samples->end(), dSamples);

 thrust::device_ptr<int> dCounts = thrust::device_malloc<int>(n);
 thrust::copy(counts->begin(), counts->end(), dCounts);

 float *dSamples_raw = thrust::raw_pointer_cast(dSamples);
 int *dCounts_raw = thrust::raw_pointer_cast(dCounts);

 CUDA_CountAndAdd_Kernel<<<1, n>>>(dSamples_raw, dCounts_raw);

 thrust::device_free(dCounts);
 thrust::device_free(dSamples);
}

Ядро выглядит так:

__global__ void CUDA_CountAndAdd_Kernel_Device(float *samples, int *counts) 

Но компиляция не удалась:

ошибка:Аргумент типа "float **" несовместим с параметром типа "thrust :: host_vector> *"

Хм?!Я думал, что даю необработанные указатели float и int?Или я что-то упускаю?

Это было полезно?

Решение

Вы вызываете ядро, используя имя функции, в которой находится вызов, а не имя ядра - отсюда и несоответствие параметров.

Изменять:

CUDA_CountAndAdd_Kernel<<<1, n>>>(dSamples_raw, dCounts_raw);

к

CUDA_CountAndAdd_Kernel_Device<<<1, n>>>(dSamples_raw, dCounts_raw);

и посмотрим, что произойдет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top