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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top