0

问题是:

共享数组perBlockMsg[i] 保存所有等于 0 的值,但它应该是大于 0 的十进制值,这些值也是如此d_msg[]d_msg[]ia 一个 2D 数组,我已将其展平为 1D 并确保其数据已成功传递到设备中。

__global__ void add( int *d_msg, int *d_checkSumArray) {

    int i=threadIdx.x;
    int j=blockIdx.x;
    extern  __shared__ int perBlockMsg[];

    if(d_msg[i* gridDim.x + j]<=1)
    {
        perBlockMsg[i]=d_msg[i* gridDim.x + j];
    }

    __syncthreads();

    if(j==2 && i<=gridDim.x)  //here i is the row number
    {
        d_checkSumArray[i]=perBlockMsg[i];
    }
}

内核调用如下(假设)M = 7,R = 4,这两个变量也是动态的

add<<<R,(M+R), (M+R)* sizeof(int)>>>( d_msg, d_checkSumArray ); 

有人可以指出问题可能出在哪里吗?

4

1 回答 1

1

提供答案以将其从未答复的列表中删除。

代码中发现的主要问题是这个测试:

if(d_msg[i* gridDim.x + j]<=1)

不正确,应该是这样的:

if(d_msg[i* gridDim.x + j]>=1)

如问题所示,捕获“大于 0 的十进制值”。

共享变量的文档中还涵盖了后续问题。

一种方法是使用单个动态分配(指针)处理所有共享变量:

extern  __shared__ int perBlockMsg[];
int *msgLength = perBlockMsg + perBlockMsgLength;
于 2014-08-18T16:24:57.163 回答