找到不准确结果的原因,从研究论文中复制代码

时间:2015-05-26 03:10:10

标签: cuda parallel-processing

我正在尝试复制此人制作的线性编程解算器

http://www.idi.ntnu.no/~elster/master-studs/spampinato/spampinato-linear-prog-gpu-report.pdf

我使用的设备是Quadro FX 1800M,计算能力为1.2。

我的问题是,当我每块启动超过22个线程时,大多数时候我得到的结果不准确(有时全为零),但在特殊情况下,当我每块启动512个线程时,我得到准确的结果。

这是我做的一些测试。 (顺序表示基于CPU的版本)用于比较

Iteration No 1 : of Sequential Version
Optimum Found 24.915583
Elapsed time: 0.001049725

Iteration No 1: of Parallel Version
BS-(Number of Threads) = : 20
Optimum found: 24.915583

Iteration No 2: of Parallel Version
BS-(Number of Threads) = : 256
Optimum found: 24.915607

Iteration No 3: of Parallel Version
BS-(Number of Threads) = : 512
Optimum found: 24.917068

Iteration No 4: of Parallel Version
BS-(Number of Threads) = : 2
Optimum found: 24.915583

Iteration No 5: of Parallel Version
BS-(Number of Threads) = : 456 
Optimum found: -30693000299230806209574138333792043008.000000

Iteration No 6: of Parallel Version
BS-(Number of Threads) = : 456
Problem unsolvable: either qth==0 or loop too long.

Iteration No 7: of Parallel Version
BS-(Number of Threads) = : 512
Optimum found: 25.010513

Iteration No 8: of Parallel Version
BS-(Number of Threads) = : 256
Problem unsolvable: either qth==0 or loop too long.

Iteration No 9: of Parallel Version
BS-(Number of Threads) = : 256
Optimum found: 0.000000

Iteration No 10: of Parallel Version
BS-(Number of Threads) = : 512
Optimum found: 0.000000

有人可以指出我可能做错了什么,我知道我没有发布代码,但我假设代码是正确的,因为我从研究论文中复制它,问题就在我的最后。

我还应该指出,编译cuda代码时出现以下错误

ptxas /tmp/tmpxft_000017e7_00000000-10_culiblp.ptx,第263行;警告:不支持Double。降级为漂浮

这可能是结果的原因吗?

1 个答案:

答案 0 :(得分:3)

  

我的问题是,当我每个块启动超过22个线程时,大部分时间我得到的结果都不准确(有时全为零),

     

有人可以指出我可能做错了吗,

我无法构建代码,因为文件中似乎缺少头文件。我可以尝试构建那些,但我注意到的一件事是变量(或常量)BS似乎没有在任何地方定义。所以我猜它最初是在culiblp.h中定义的(未提供。)

在文章中查看culiblp.cu,我注意到一些内核发布如下:

init_AInD<<<dim3(kn, km1), dim3(BS, BS)>>>(devA, devD, m, n);
                           ^^^^^^^^^^^^

这是创建尺寸BS * BS的2D线程块。因此,如果将BS设置为大于22的值,则产品将超过512个线程,这是cc1.x GPU的最大值。在这种情况下,将BS设置为高于22的值将导致内核启动失败。

我认为当BS大于22时,这肯定是代码失败的一个因素。

您可以使用cuda-memcheck运行代码来证明这一点。另外,如果您打算使用此代码,我建议您添加proper cuda error checking

BS的值大于22的明显的,偶然的成功可能会在前一次成功运行(假设BS为22或更低)时解释。即使内核失败,如果先前成功的中间数据从前一次运行中留在内存中,也可能会产生正确的结果。