Frage

da ich großen Arrays von Zahlen mit CUDA sortieren benötigen, kam ich mit der Verwendung von Schub entlang. So weit, so gut ... aber was, wenn ich einen „handschriftlich“ kernel nennen wollen, mit einem Schub :: host_vector die Daten enthalten?

Mein Ansatz war (backcopy fehlt):

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

Der Kernel sieht aus wie:

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

Aber Kompilierung schlägt fehl mit:

  

Fehler: Argument vom Typ "float **" ist   inkompatibel mit Parametern des Typs   "Schub :: host_vector> *"

Hä ?! Ich dachte, dass ich geben float und int raw-Zeiger? Oder bin ich etwas fehlt?

War es hilfreich?

Lösung

Sie fordern den Kernel mit dem Namen der Funktion der Anruf ist, nicht den Namen des Kernel -. Damit die Parameter Mismatch

Ändern:

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

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

und sehen, was passiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top