pau*_*ago 2 parallel-processing cuda reduction
我正在努力使代码并行运行(CUDA).简化的代码是:
float sum = ... //sum = some number
for (i = 0; i < N; i++){
f = ... // f = a function that returns a float and puts it into f
sum += f;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是sum+=f因为它需要sum在线程之间共享.我__shared__在声明sum(__shared__ float sum)时尝试使用该参数,但这不起作用(它没有给我正确的结果).我也听说过减少(并知道如何在OpenMP上使用它),但不知道如何在这里应用它.
任何帮助将不胜感激.谢谢!
这是代码:
#include <stdio.h>
__global__ void para(float* f, int len) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i < len ){
// calculate f[i], f in iteration ith
f[i] = i;
}
}
int main(int argc, char ** argv) {
int inputLength=1024;
float * h_f;
float * d_f;
int size = inputLength*sizeof(float);
h_f = (float *) malloc(size);
cudaMalloc((void**)&d_f , size);
cudaMemcpy(d_f, h_f, size, cudaMemcpyHostToDevice);
dim3 DimGrid((inputLength)/256 +1 , 1 , 1);
dim3 DimBlock(256 , 1, 1);
para<<<DimGrid , DimBlock>>>(d_f , inputLength);
cudaThreadSynchronize();
cudaMemcpy(h_f, d_f, size , cudaMemcpyDeviceToHost);
cudaFree(d_f);
// do parallel reduction
int i;
float sum=0;
for(i=0; i<inputLength; i++)
sum+=h_f[i];
printf("%6.4f\n",sum);
free(h_f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
平行减少部分可以用工作CUDA并行减少(例如这个)来代替.很快我会花时间改变它.
编辑:
以下是使用CUDA执行并行缩减的代码:
#include <stdio.h>
__global__ void para(float* f, int len) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i < len ){
// calculate f[i], f in iteration ith
f[i] = i;
}
}
__global__ void strideSum(float *f, int len, int strid){
int i = threadIdx.x + blockDim.x * blockIdx.x;
if(i+strid<len){
f[i]=f[i]+f[i+strid];
}
}
#define BLOCKSIZE 256
int main(int argc, char ** argv) {
int inputLength=4096;
float * h_f;
float * d_f;
int size = inputLength*sizeof(float);
h_f = (float *) malloc(size);
cudaMalloc((void**)&d_f , size);
cudaMemcpy(d_f, h_f, size, cudaMemcpyHostToDevice);
dim3 DimGrid((inputLength)/BLOCKSIZE +1 , 1 , 1);
dim3 DimBlock(BLOCKSIZE , 1, 1);
para<<<DimGrid , DimBlock>>>(d_f , inputLength);
cudaThreadSynchronize();
int i;
float sum=0, d_sum=0;
// serial sum on host. YOU CAN SAFELY COMMENT FOLLOWING COPY AND LOOP. intended for sum validity check.
cudaMemcpy(h_f, d_f, size , cudaMemcpyDeviceToHost);
for(i=0; i<inputLength; i++)
sum+=h_f[i];
// parallel reduction on gpu
for(i=inputLength; i>1; i=i/2){
strideSum<<<((i/BLOCKSIZE)+1),BLOCKSIZE>>>(d_f,i,i/2);
cudaThreadSynchronize();
}
cudaMemcpy(&d_sum, d_f, 1*sizeof(float) , cudaMemcpyDeviceToHost);
printf("Host -> %6.4f, Device -> %6.4f\n",sum,d_sum);
cudaFree(d_f);
free(h_f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1404 次 |
| 最近记录: |