2016-04-28 4 views
2

ich ein CUDA-Programm, das Schub verwendet :: reduzieren Summen parallelisieren: zum BeispielKraft CUDA Vorstoß :: reduzieren ohne Parallelität auszuführen

thrust::device_ptr<double> tmp(aux); 
double my_sum = thrust::reduce(tmp, tmp + G); 

wo double* aux Punkte zu G zusammenhängenden Doppeln auf dem Gerät. Ich muss die Laufzeit des gesamten parallelisierten Programms mit einer Version ohne parallele Berechnung vergleichen. Gibt es eine Möglichkeit, thrust::reduce mit nur einem Thread auf dem Gerät auszuführen? Ein globaler Switch wäre die bequemste Option.

Antwort

6

Sie können dies tun, indem Sie thrust::reduce innerhalb eines Kernels mit der seriellen Ausführungsrichtlinie aufrufen und dann diesen Kernel mit einem einzigen Thread starten. Etwas wie:

__global__ void serial_reduce(double *result, double *aux, int G) 
{ 
    *result = thrust::reduce(thrust::seq, aux, aux+G); 
} 

double *result; 
cudaMallocManaged(&result, sizeof(double)); 
serial_reduce<<<1,1>>>(result, aux, G); 
cudaDeviceSynchronize(); 

[Hinweis in Browser geschrieben und völlig ungetestet, auf eigene Gefahr]

Verwandte Themen