【问题标题】:Finding reason for the inaccurate results, copying code from research paper查找结果不准确的原因,从研究论文中复制代码
【发布时间】:2015-05-26 03:10:10
【问题描述】:

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

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

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

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

这是我进行的一些测试运行。 (Sequential 表示基于 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 行;警告:不支持双精度。降级为浮动

这可能是导致结果的原因吗?

【问题讨论】:

标签: cuda parallel-processing


【解决方案1】:

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

谁能指出我做错了什么,

我无法构建代码,因为论文中似乎缺少头文件。我可以尝试构建这些,但我注意到的一件事是变量(或常量)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)。即使内核失败,如果之前成功的中间数据留在内存中,那么事情似乎会产生正确的结果。

【讨论】:

  • 感谢您的帮助,我忽略了这个 init_AInD>>(devA, devD, m, n);跨度>
猜你喜欢
  • 2014-04-27
  • 2017-03-20
  • 1970-01-01
  • 2010-09-11
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2021-07-23
相关资源
最近更新 更多