我的显卡计算能力2.0,toolkit4.2.
实际编程中遇到这样一个问题:我要在每个线程中构造一个较为复杂的模型(每个线程需要执行的指令较多),这时会出现局部内存不够用的情况(我推测)。手册说2.0的计算能力每个线程有512K的局部内存,我大概估算了一下每个线程中的局部变量,应该是不会达到这个数量的。可是通过在kernel中打印一些信息发现,每个线程在执行到一定的阶段就会跳出,而不会执行完(因为特定地点的打印信息没有被打印),而且在这之后再启动其他kernel都不会被执行。我试着把所有double类型的变量都换成float,每个线程可以执行到更靠后的地方,但还是跑不完。CUDA在运行时似乎不会给出相应的错误提示信息(内存不够用等信息)。我想问一下这种问题是否一定是局部内存不够用的情况,有什么解决方法吗?
1 请检查编译选项中是否将计算能力设置为compute20和sm20, 默认情况下是compute10和sm10, 此时只有16KB的Local memory
2 运行visual profile来查看你的程序对register和local memory的使用情况
3 优化你的内核,尽量减少定义的变量,使用编译器临时变量完成计算(使用完会被释放)<-----有错误
4 检查你的内核计算上有没有出错,比如除以0这样的错误
5 在你的内核调用后面加上printf(“%s\n”, cudaGetErrorString(cudaGetLashError()))来看看内核执行出错的信息
编译器临时变量是指?kernel或device函数中定义的变量(数组或单个变量)是否都是临时变量?
提示的错误都是unknown error。
cuda中device函数的调用现在默认的还是内联吗?如果是,device函数中申明的数组占用的空间在调用完后会释放吗
对于前面说的第3个情况,我表述有误!
对于需要寄存的情况,你可以编译时加上–ptxas-options=-v
一般在内核中分配私有变量,会占用寄存器,所以你定义的私有变量越多,寄存器占用越多
还有一种情况,就是计算的中间结果也是需要保存在寄存器中的,所以如果你一个计算公式很长很复杂, 那么会使用越多的寄存器来保存临时的中间变量,不过这些保存中间变量的临时寄存器在使用后会被回收以后再用。
建议执行visual profile,查看一下local memory的使用情况!
1:建议楼主提供更为详细的代码信息和调试信息。
2:如果一个线程要占用大量的local memory的话,建议设法改进或者拆分算法,否则一般来说,local memory用的多了比较影响速度。
3:kernel内寄存器的使用量,取决于寄存器用量最多的那个时刻所需要的寄存器数量。一些中间结果也需要使用寄存器,具体由编译器优化决定。编译器会尽量优化减少中间结果的寄存器用量,重复利用这些寄存器。此外,考虑到寄存器的分配粒度,分配到的寄存器总是大于等于所需要的寄存器。
4:以及kernel里面如果定义数组,而访问数组的index如果在编译的时候无法得知,那么该数组也会被放入local memory,因为fermi无法对寄存器寻址。
cudaErrorUnknown一般会在如下情况下被触发:
在没有nsight的情况下,访问无效的地址(例如越界).
建议检查一下数组/指针的使用。
建议楼主重点考虑一下ICE的7#的第一行。