Gpu内计算是不是有一定的局限性啊?

我分配了50个块,每块中50个线程,也就是相当于2500个线程,没个线程都进行独立的矩阵运算,线程中先拷贝globalmemory中的矩阵A(100100float型的)到线程内的localmemory中,然后根据各线程内的参数对矩阵进行操作。但是运行过程中出错了,TraversePoint<<<BlockNum,ThreadNum>>>(Dimen,X_dim,Y_dim,Spacecout,Crosscount,gpu_Error);刷一下就跳过去了,然后我看了一下返回值,根本不对,一堆乱七八糟的数字和符合。
我分析了一下原因,大家看看对不对。单看没个线程都分配一个100
100float型的矩阵这条,似乎就不太合理,100100482500=800000000bit=781250kb=762.9M(float型为4字节,每个字节占8bit,一共2500个线程)
我的显存才800多M所以,我这样分配是不是显存就不够了,计算无法完成?

看起来和内存关系不大啊,似乎问题不在这里……不过我也没看出来……

那我这样分配每个线程内的localmemory的话岂不是超出了显存

顺便问一下我的显卡为GTX260那我的local memory和globalmemory都是多大?

[

是不是这个问题你可以直接将数组改小一点看可以计算不??

有些错误是自己想不出来的,一定要让机器告诉你,所以要学习使用一些输出语句来显示一定的错误,

呵呵,其实我也是新手,只是在这里时间比较久了,在坛子里面很多高手喔,我也是在这里学到的

说得不好,请直接无视啊。

你可以直接运行一下SDK里面的deviceQuery
或者你可以上网查一查,用GPU-Z似乎也可以喔

呵呵!你说得很不错啊!程序是debug出来的,不是想出来的,呵呵!我估计他的问题,还可能是存储器爆了,而且 local memory是近似禁止使用的,使用了它一定得考虑能否不用它,呵呵!

多谢大家分析,我也再继续查找一下

请问风晨版主“而且 local memory是近似禁止使用的”这句话是什么意思,我在没个线程中自己定义的int a;、float *b;是不是分配在localmemory中的?还有我在global函数中定义
float *Omega;
for (int i=0;i<10;i++)
{
Omega[i]=2; emudebug时提示这里错误!(写位置冲突)
}
为什么?

啊!你这代码会出段错误啊!与C语法不兼容,呵呵!建议你看一下C的指针部分

我那句话的意思是“不要轻易使用local memory,除非你有绝对的理由,呵呵!”

[ 本帖最后由 yyfn风辰 于 2010-4-13 19:51 编辑 ]

恩,那里确实写的不对,我后来改了,在global和device里面我用静态分配,float Omega[1000];

现在我又碰到麻烦了,纹理操作时
我使用纹理绑定操作
texture rTXin;
·
·
·
cudaMemcpy(gpu_Xin,Xin,sizeof(float)*220,cudaMemcpyHostToDevice);
·
·
·
cudaBindTexture(0,rTXin,gpu_Xin,sizeof(float)220);
然后再global里面用tex1Dfetch(rTgp,bid
blockDim.x+tid);拾取并返回,但是发现一个问题,只有Xin的前40个绑定上去了,后边的全都是0
不知道什么原因!

可能越界了,因为纹理越界后的值就是0,如果可以的话,帖一下你的代码