CUDA采样matrixMul错误

时间:2012-12-10 19:11:09

标签: cuda sample

我对cuda非常陌生,几周前开始阅读关于并行编程和cuda的内容。在我安装了cuda工具包之后,我正在浏览sdk示例(随工具包的安装一起提供),并想尝试其中的一些。我从0_Simple文件夹开始使用matrixMul。这个程序执行正常(我使用的是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

这是否与内存分配有关。我应该在那里做些改变吗?它们会是什么?

3 个答案:

答案 0 :(得分:2)

我建议更仔细地查看内核中使用的索引(matrixMulCUDA) - 这听起来像是在写入未分配的内存。

更具体地说,你是唯一改变dimsA和dimsB变量的东西吗?在内核中,他们使用线程和块索引来访问数据 - 您是否也相应地增加了数据大小?内核中没有进行边界检查,因此如果您只是更改内核启动配置而不是数据,那么您可能会将数据写入其他内存

答案 1 :(得分:2)

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

请参阅描述TDR的NVidia论坛上的这篇文章以及如何关闭它:

WDDM TDR - NVidia devtalk forum

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

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

答案 2 :(得分:2)

您的新问题实际上只是NVidia示例中提供的严格容差。您的内核运行正常。它只是抱怨累积的错误大于他们为这个例子设置的限制。这只是因为你正在进行更多的数学运算,这些运算都会累积错误。如果你看一下它给你的数字,你只需要大约0.00005的参考答案,这在经过大量单精度浮点数学运算后并不罕见。您现在获得这些错误而不是默认矩阵大小的原因是原始基质较小,因此需要较少的操作来增加。 N x N矩阵的矩阵乘法需要大约N ^ 3个运算,因此所需的运算数量增加得比矩阵的大小快得多,累积误差将随着运算次数的增加而增加。

如果你看起来接近runTest()函数的末尾,就会调用computeGold()来计算你CPU上的参考答案。然后应该调用shrCompareL2fe来比较结果。最后一个参数是公差。如果增加此容差的大小(例如,增加到1e-3或1e-4而不是1e-5),则应消除这些错误消息。请注意,可能有几个这样的调用。我拥有的SDK示例的版本具有可选的CUBLAS实现,因此它也可以与黄金进行比较。印刷语句后面的那个“比较CUDA matrixMul& Host results”就是你要改变的那个。