我希望有人可以分享我遇到的问题。一个小程序采用一系列双精度数(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];
}
}
}
}
答案 0 :(得分:1)
我通过拆分处理是较小的块然后循环遍历chink列表来解决问题。显然问题在于有限数量的寄存器。低端GT630卡似乎很快耗尽了寄存器。这可能不是理想的正确解决方案,但它适用于我的情况。