设备配置与计算能力的问题

斑竹们好 遇到一个问题 就是把compute_10;sm_10;改成compute_20;sm_20;(机器的计算能力是2.1) 。程序的结果错误了。程序中没有使用 shared mem 。估计出错的是矩阵相乘的一部分(还没有使用shared mem进行优化)。
2.1的机器如果编译时配置是1.0 那么是否机器使用的只是1.0的某些特性?烦请斑竹对这方面的问题予以解答。谢谢有问必答的斑竹们。

还有就是我的属性页怎么和论坛里比人的属性页不一样。
[attach]3309[/attach]
没有Runtime API选项。

LZ您好:

您的问题90%以上可能是您代码的BUG,请仔细调试和检查您的代码。已经多次向您建议过这一点了。

2.1的硬件如果按照compute_10,sm_10编译,那么第一将无法使用更高版本计算能力的特性,比如printf,比如双精度,并直接编译为1.0计算能力版本硬件适用的二进制代码。同时exe文件中会嵌入1.0硬件的PTX代码。在您的2.1的硬件上执行的时候,会根据此PTX代码jit编译生成适合您GPU运行的二进制代码。但此时因为PTX版本的限制,您GPU原生支持的一些特性将无法使用。

其他有关编译参数的讨论,详见之前答复您的帖子。

您的属性页是VS2010下的,和VS2008下的有所不同。

大致如上,以及最后一次建议您,要解决问题,请仔细检查和调试您的代码,也不妨贴出代码,让其他人协助您检查。如果您继续这样每次空洞地抱怨,我将无视您的帖子。

祝您好运~

1>CudaClean:
1>
1> C:\Users\Administrator\Desktop\test\Wave1>“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe” -ccbin “F:\Microsoft Visual Studio 10.0\VC\bin” -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include" --keep-dir “Release” -maxrregcount=0 --machine 32 --compile -Xcompiler "/EHsc /nologo /Od /Zi /MD " -o “Release\kernel.cu.obj” “C:\Users\Administrator\Desktop\test\Wave1\kernel.cu” -clean

1>CudaBuild:
1> Compiling CUDA source file kernel.cu…
1>
1> C:\Users\Administrator\Desktop\test\Wave1>“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe” -gencode=arch=compute_20,code="sm_20,compute_20" --use-local-env --cl-version 2010 -ccbin “F:\Microsoft Visual Studio 10.0\VC\bin” -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include" --keep-dir “Release” -maxrregcount=0 --machine 32 --compile -Xcompiler "/EHsc /nologo /Od /Zi /MD " -o “Release\kernel.cu.obj” “C:\Users\Administrator\Desktop\test\Wave1\kernel.cu”

斑竹好,我之前没有发过有关编译参数的帖子。对于参数,我只改动了compute ;sm .代码已贴,感谢斑竹指正。

LZ您好:

无法根据您给出的信息人肉编译+DEBUG为您指出问题(甚至是逻辑问题)的,请您借助调试软件,仔细检查以保证您的代码符合您的本意。

别无其他建议了,祝您好运~

ice好 我终于发现问题了 。 在矩阵相乘的时候 我给寄存器没有初始化!!!导致程序在compute_20下运行错误。对于程序调试太弱 好好看文档。谢谢ice。

还有个问题就是 我的程序不知道怎么突然就出错了 然后我把代码复制重建工程,程序结果就又是对的。我的程序还没来得及释放分配的内存,请问是不是这方面的问题,还是有其他原因?

LZ您好:

1:经过简单测试,没有初始化的寄存器确实在compute_10和compute_20下行为不同。但这并不足以说明您的“compute_10正确而compute_20错误”这个现象。以及,不初始化就直接使用,本身是不正确的写法。您需要先解决掉这些隐患才好。

2:无法理解您复制粘贴一遍就能改变程序运行正确与否。
以及,您的程序如果没有手动释放您申请的显存/内存,那么他们会在您的程序运行结束的时候被释放。
以及,目前也无法您的问题是哪方面的原因。

大致如此,祝您调试顺利~

第二个问题是我把之前的代码(CUDA 4.2下编译运行)在CUDA 5 里面编译运行,结果输出全零了。。。我再检查检查。

还有一个问题,在compute_10下我的一个有限差分的kernel大约要7min,可是在compute_20下就需要12min左右。我用的cudaevent计时。 我再调试调试,有问题再请教。谢谢ice大神。

LZ您好:

1:我这里从未出现过这样的情况,我的4.2下通过的源码在5.0下都是直接可用的,您不妨继续检查下。

2:无法评价您这个问题,如果您需要继续讨论这个新的问题,请另开一贴并给出您详细的信息。

大致如此,祝您好运~