各位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,但是却得不到正确的结果,还望大家指点。