我正在尝试复制此人制作的线性编程解算器
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。降级为漂浮
这可能是结果的原因吗?
答案 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或更低)时解释。即使内核失败,如果先前成功的中间数据从前一次运行中留在内存中,也可能会产生正确的结果。