2016-04-28 2 views
2

У меня есть программа, которая использует CUDA тяги :: уменьшить распараллелить суммы: например,сила тяги CUDA в :: уменьшить, чтобы выполнить, не параллельности

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

где double* aux указывает на G смежных двойников на устройстве. Мне нужно сравнить время выполнения всей распараллеленной программы с версией без параллельных вычислений. Есть ли способ запустить thrust::reduce, используя только один поток на устройстве? Наиболее удобным вариантом будет глобальный коммутатор.

ответ

6

Вы должны быть в состоянии сделать это, вызвав thrust::reduce в ядре с использованием политики последовательного выполнения, а затем запустив это ядро ​​с помощью одного потока. Что-то вроде:

__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(); 

[Примечание написано в браузере и полностью непроверенный, используйте на свой страх и риск]

Смежные вопросы