2010-03-07 5 views
3

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

Мой подход (backcopy отсутствует):

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) 

Но компиляция завершается с:

error: argument of type "float **" is incompatible with parameter of type "thrust::host_vector> *"

Да ?! Я думал, что даю float и int raw-pointers? Или я что-то пропустил?

ответ

4

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

Изменение:

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

в

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

и посмотреть, что происходит.

+0

D'oh! - Ошибка всегда одна, а не в реализации. –

 Смежные вопросы

  • Нет связанных вопросов^_^