2016-04-28 8 views
2

を実行するために減らす::合計を並列化する削減:例えば、フォースCUDAの推力::私は推力を使用するCUDAプログラムを持っていない並列処理

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

double* auxポイントデバイス上のGの連続倍に。私は並列化されたプログラム全体の実行時間を並列計算のないバージョンと比較する必要があります。デバイス上のスレッドを1つだけ使用してthrust::reduceを実行する方法はありますか?グローバルスイッチは最も便利なオプションです。

答えて

6

これは、シリアル実行ポリシーを使用してカーネル内でthrust::reduceを呼び出してから、そのカーネルを1つのスレッドで起動することで可能になります。ような何か:

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

[自身の責任で使用して、ブラウザで書かれており、完全にテストされていない注意]

関連する問題