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

Finding reason for the inaccurate results, copying code from research paper

我正在尝试复制此人制作的线性规划求解器

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 行;警告:不支持双精度。降级为浮动

这可能是结果的原因吗?

My problem is that when I launch more than 22 threads per block then most of the time I get inaccurate results(sometimes all zeros),

Can somebody kindly point what I might be doing wrong,

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

查看论文中的 culiblp.cu,我注意到一些内核启动是这样的:

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

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

我相信当 BS 大于 22 时,这肯定是导致代码失败的一个因素。

您可以通过 运行 将您的代码与 cuda-memcheck 结合来证明这一点。此外,如果您打算使用此代码,我建议添加 proper cuda error checking.

BS 的值高于 22 的明显的、偶尔的成功可能可以解释为如果你已经完成了 运行(假设 BS 为 22 或更少)紧接在前。有可能即使内核出现故障,如果先前成功的中间数据从先前 运行 留在内存中,那么事情似乎会产生正确的结果。