2

我对 cuda 很陌生,几周前才开始阅读有关并行编程和 cuda 的内容。安装 cuda 工具包后,我正在浏览 sdk 示例(随工具包的安装提供)并想尝试其中的一些。我matrixMul从 0_Simple 文件夹开始。该程序执行良好(我使用的是 Visual Studio 2010)。现在我想更改矩阵的大小并尝试使用更大的矩阵(例如 960X960 或 1024x1024)。在这种情况下,某些东西崩溃了(我得到黑屏,然后是消息:显示驱动程序停止响应并已恢复)。

我正在更改代码中的这两行(来自 main 函数):

    dim3 dimsA(8*4*block_size, 8*4*block_size, 1);
    dim3 dimsB(8*4*block_size, 8*4*block_size, 1);

在他们之前:

dim3 dimsA(5*2*block_size, 5*2*block_size, 1);
dim3 dimsB(5*2*block_size, 5*2*block_size, 1);

有人可以指出我做错了什么。并且我是否应该在此示例中更改其他内容以使其正常工作。谢谢!

编辑:就像你们中的一些人建议的那样,我更改了超时值(0 不知何故对我不起作用,我将超时设置为 60),所以我的驱动程序不会崩溃,但我得到了大量错误列表,例如:... ……

Error! Matrix[409598]=6.40005159, ref=6.39999986 error term is > 1e-5
Error! Matrix[409599]=6.40005159, ref=6.39999986 error term is > 1e-5

这是否与内存分配有关。我应该在那里进行更改吗?它们可能是什么?

4

3 回答 3

2

I'd advise looking at the indexing used in the kernel (matrixMulCUDA) a bit closer - it sounds like you're writing to unallocated memory.

More specifically, is the only thing that you changed the dimsA and dimsB variables? Inside the kernel they use the thread and block index to access the data - did you also increase the data size accordingly? There is no bounds checking going on in the kernel, so if you just change the kernel launch configuration, but not the data, then odds are you're writing past your data into some other memory

于 2012-12-10T22:04:20.683 回答
2

您的新问题实际上只是 NVidia 示例中提供的严格公差。您的内核运行正常。它只是抱怨累积的错误大于他们为此示例设置的限制。这只是因为您正在做更多的数学运算,这些运算都在累积错误。如果您查看它给您的数字,您只会偏离参考答案大约 0.00005,这在大量单精度浮点数学之后并不罕见。你现在得到这些错误而不是默认矩阵大小的原因是原始矩阵更小,因此需要更少的操作来相乘。N x N 矩阵的矩阵乘法需要 N^3 次操作,

如果您查看 runTest() 函数的末尾附近,则会调用 computeGold() 来计算 CPU 上的参考答案。然后应该调用类似 shrCompareL2fe 的方法来比较结果。最后一个参数是公差。如果您增加此容差的大小(例如,增加到 1e-3 或 1e-4 而不是 1e-5),您应该消除这些错误消息。请注意,可能有几个这样的调用。我拥有的 SDK 示例版本有一个可选的 CUBLAS 实现,因此它也与黄金进行了比较。紧跟在“比较 CUDA matrixMul 和主机结果”的打印语句之后的那个是您想要更改的那个。

于 2012-12-11T23:28:36.667 回答
2

您是否在 Windows 中禁用了超时检测和恢复 (TDR)?完全有可能您的代码运行良好,但较大的矩阵导致内核执行超过 Windows 的超时,这导致 Windows 假定卡被锁定,因此它重置卡并为您提供与该卡相同的消息你描述。即使这不是您的问题,您也绝对希望在 Windows 中进行任何严肃的 CUDA 工作之前禁用它。默认情况下超时时间很短,因为正常的图形渲染每帧只需要几分之一秒。

请参阅 NVidia 论坛上描述 TDR 以及如何关闭它的帖子:

WDDM TDR - NVidia devtalk 论坛

特别是,您可能希望将键 HKLM\System\CurrentControlSet\Control\GraphicsDrivers\TdrLevel 设置为 0(检测已禁用)。

或者,您可以通过设置 HKLM\System\CurrentControlSet\Control\GraphicsDrivers\TdrDelay 来增加超时时间。它默认为 2 并以秒为单位指定。就个人而言,我发现在 CUDA 中工作时 TDR 总是很烦人,所以我只是将其完全关闭。IIRC,您需要重新启动系统才能使任何与 TDR 相关的更改生效。

于 2012-12-11T02:36:34.607 回答