Domanda

in quanto avevo bisogno di ordinare grandi array di numeri con CUDA, mi è venuto insieme con l'utilizzo di spinta. Fin qui, tutto bene ... ma cosa quando voglio chiamare un kernel "a mano", con una spinta :: host_vector contenente i dati?

Il mio approccio è stato (backcopy manca):

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);
}

L'aspetto del kernel come:

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

Ma la compilazione fallisce con:

  

Errore: argomento di tipo "float **" è   incompatibile con parametro di tipo   "Spinta :: host_vector> *"

Eh ?! Ho pensato che stavo dando float e int prime puntatori? O mi sto perdendo qualcosa?

È stato utile?

Soluzione

si sta chiamando il kernel con il nome della funzione della chiamata in, non il nome del kernel -. Quindi il parametro non corrispondente

Modifica:

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

a

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

e vedere cosa succede.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top