0

我希望有人可以分享对我遇到的问题的见解。一个小程序采用一个双精度数组(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];
            }
        }
    }
}
4

1 回答 1

1

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

于 2013-01-06T20:00:44.490 回答