Llamando kernel CUDA escrito a mano con empuje
Pregunta
Ya que necesitaba para clasificar grandes conjuntos de números con CUDA, vine junto con el uso de empuje. Hasta ahora, todo bien ... pero lo que si quiero llamar a un núcleo "escrito a mano", que tiene un empuje :: host_vector que contiene los datos?
Mi enfoque era (backcopy falta):
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);
}
Las miradas del núcleo como:
__global__ void CUDA_CountAndAdd_Kernel_Device(float *samples, int *counts)
Pero compilación falla con:
error: argumento de tipo "float **" es incompatible con el parámetro de tipo "Empuje :: host_vector> *"
¿Eh ?! Me pareció que estaba dando flotador y int primas triples? O me estoy perdiendo algo?
Solución
a la que llama el núcleo con el nombre de la función de la llamada está en, no el nombre del núcleo -. Por lo tanto, el parámetro de desfase
Cambio:
CUDA_CountAndAdd_Kernel<<<1, n>>>(dSamples_raw, dCounts_raw);
a
CUDA_CountAndAdd_Kernel_Device<<<1, n>>>(dSamples_raw, dCounts_raw);
y ver qué pasa.