我希望有人可以分享对我遇到的问题的见解。一个小程序采用一个双精度数组(100000 个元素),将该数组的一个子集相加,并将结果分配给另一个数组的一个元素。这似乎是一项非常基本的任务,但是我的 GT630 表现出奇怪的行为。发生的情况是它适用于较小的间隔长度值(但相当慢),但是一旦间隔长度变大,大约 300,代码就会失败。
更有趣的是,问题似乎不在于加法,而在于将结果分配回输出数组。如果下面代码的最后一行
output_dev[threadIdx.x] = totalSum;
改为
output_dev[threadIdx.x] = input_dev[0];
然后代码运行得非常快——至少快 100 倍,并且适用于任何较大的 intervalLength 值。此外,如果一条线
totalSum=1;
在分配之前,代码也可以快速运行并且没有错误。一些实验还表明,如果总和是通过一系列语句而不是使用循环来计算的,那么代码也可以正常工作。
我正在使用具有 96 个 CUDA 线程的 GT630 4GB,在一个块中启动 96 个线程。
编码:
extern "C" __global__ void TestCompute(double* input_dev, int input_devLen0, int* args_dev, int args_devLen0, double* output_dev, int output_devLen0)
{
int intervalLength = args_dev[0];
double totalSum = input_dev[num];
if (num < input_devLen0)
{
for (int k = 0; k <= input_devLen0; k++)
{
totalSum = 0.0;
for (int i = 0; i < intervalLength; i++)
{
if (input_devLen0 > i)
{
totalSum += input_dev[i];
}
}
if (output_devLen0 > threadIdx.x)
{
// totalSum = 1;
output_dev[threadIdx.x] = totalSum; // input_dev[0];
}
}
}
}