关于CUDA计算数组求和的问题

各位CUDA高人,如题所示,最近在CUDA方面遇到了些问题,还望大家能帮下忙:

问题描述如下:有一数组A;假设其元素个数为n; i为A的元素下标;要实现如下功能:当i==0时,求其后面16个元素的和,放在数组d_after中;当0<i<16时,求其后面16个点的元素和存放在数组d_after中,求其前面i个元素的和存放在d_ahead中;当15<i<n-16时,求其前面和后面各16点的数据和,分别存放在d_ahead和d_after中;当n-17<i<n-1时,求其前面16点的和其后面n-i-1个点的和;当i==n-1时,求其前面16点的和。

在实现时,想利用CUDA中多线程计算,每一个线程计算一个元素,但是这样涉及到一个问题:就是同一个地址空间可能被多个线程同时访问。程序如下:但是得不到正确的结果,还望大家指点一下:

内核函数如下:

global void myfun(float* d_in, float* d_out,static float* d_ahead,static float* d_after,int n )//分别为输入、输出、存放前面元素和数组和后面元素和数组、输入数组元素个数

{

  Const int i=blockIdx.x*blockDim.x+threadIdx.x;

  if(i==0)

{

  for(int j=1;j<17;j++)

{

d_ahead[0]+=d_in[j];

}

}

if(0<i<16)

{

for(int j=0;j<i;j++)//求前面i个元素的和

{

d_ahead[i]+=d_in[j];

}

for(int j=i+1;j<=(j+16);j++)//求后面16点的和

{

d_after[i]+=d_in[j];

}

}

if(15<i<n-16)

{

for(int j=(i-1);j>=(i-16);j–)//求前面16点和

{

d_ahead[i]+=d_in[j];

}

for(int j=(i+1);j<=(i+16);j++)//求后面16点和

{

d_after[i]+=d_in[j];

}

}

if(n-17<i<n-1)

{

for(int j=(i-1);j>=(i-16);j–)//求前面16点和

{

d_ahead[i]+=d_in[j];

}

for(int j=(i+1);j<=n-1;j++)//求后面n-i-1点和

{

d_after[i]+=d_in[j];

}

}

if(i==n-1)

{

for(int j=n-2;j>=n-17;j–)//求后面16点和

{

d_aheadr[i]+=d_in[j];

}

}

}

在程序调用时,dim3 threads(256,1,1);dim3 blocks((n+threads.x-1)/threads.x,1,1);

myfunc<<<blocks.x,threads.x>>>(d_in,d_out,d_ahead,d_after, n);

调用涉及到的变量都已分配好,在试验中,假定输入数组元素均为1,但是却得不到正确的结果,还望大家指点。

d_ahead+=d_in[j];
??想做什么
d_ahead是个指针吧?

再者,reduction不是这样做的.如此多的判断分支也不好

爱死你了,这么好的帖子要顶的

窃听风云2在线观看.

嗯,共同学习一下