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

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

    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


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

最佳答案

您的新问题实际上只是NVidia示例中提供的严格公差。您的内核运行正常。只是抱怨累积错误大于他们为该示例设置的限制。这仅仅是因为您要执行更多的数学运算,而这些运算都在累积错误。如果看一下给出的数字,则仅比参考答案小了0.00005,这在很多单精度浮点数学运算之后并不罕见。现在出现这些错误而不是使用默认矩阵大小的原因是原始矩阵较小,因此乘法所需的操作少得多。 N x N个矩阵的矩阵相乘需要大约N ^ 3个运算,因此所需运算的数量增加得比矩阵的大小快得多,并且累积误差将与运算数量成比例地增加。

如果您靠近runTest()函数的末尾,则有一个对computeGold()的调用,该调用可在您的CPU上计算参考答案。然后应该调用类似于shrCompareL2fe之类的东西来比较结果。最后一个参数是公差。如果您增加此公差的大小(例如,从1e-3或1e-4改为1e-5,则应消除这些错误消息)。请注意,可能有几个这样的电话。我拥有的SDK示例版本具有可选的CUBLAS实现,因此它也可以与黄金版本进行比较。您要更改的那条打印语句后的右边是“ Compareing CUDA matrixMul&Host results”。

关于cuda - CUDA样本matrixMul误差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13807537/

10-16 01:35