CUDA - 添加数组元素并将结果作为另一个数组元素时缓慢执行和错误

时间:2012-12-17 13:14:18

标签: c cuda gpu

我希望有人可以分享我遇到的问题。一个小程序采用一系列双精度数(100000个元素),将该数组的一个子集加在一起,并将结果赋值给另一个数组的元素。这似乎是一项非常基本的任务,但是我的GT630会产生奇怪的行为。发生的事情是它对于intervalLength的小值有效(但相当慢),但是一旦intervalLength变大,大约300,代码就会失败。

更有趣的是,问题似乎不在于添加,而在于将结果分配回输出数组。如果下面代码中的最后一行

output_dev[threadIdx.x] = totalSum;

更改为

output_dev[threadIdx.x] = input_dev[0];

然后代码以极快的速度运行 - 至少快100倍,并适用于任何大的intervalLength值。另外,如果一行

totalSum=1;

在asignment之前,然后代码也快速运行且没有错误。一些实验还表明,如果总和是计算一系列语句而不是使用循环,那么代码也可以正常工作。

我正在使用带有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];
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我通过拆分处理是较小的块然后循环遍历chink列表来解决问题。显然问题在于有限数量的寄存器。低端GT630卡似乎很快耗尽了寄存器。这可能不是理想的正确解决方案,但它适用于我的情况。