查找不准确结果的原因,从研究论文中复制代码
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 或更少)紧接在前。有可能即使内核出现故障,如果先前成功的中间数据从先前 运行 留在内存中,那么事情似乎会产生正确的结果。
我正在尝试复制此人制作的线性规划求解器
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 或更少)紧接在前。有可能即使内核出现故障,如果先前成功的中间数据从先前 运行 留在内存中,那么事情似乎会产生正确的结果。