请教一个菜鸟问题

各位大虾:
目前我在用GPU做一个矩阵的迭代算法(算法具体内容无关紧要)
我的设计是让矩阵的每一个元素对应一个线程,每一个线程的迭代计算需要用到整个初始矩阵的信息
所以我将整个初始矩阵存放到每一个SM的shared memory中
现在有一个问题就是
迭代的终止条件,需要收集每一个线程每一步的计算结果,然后与上一次计算的结果做差
如果差小于预设阈值,则说明矩阵已经收敛,无需再迭代下去了
请问我应该怎么处理这个条件的判断问题?

do{
cudaMemcpy(d_Matrix, newMatrix, sizeof(Matrix), cudaMemcpyHostToDevice);
kernel<<<m,n>>>(parameters);
newMatrix = 收集计算结果;
差值 = newMatrix - oldMatrix; // 怎么做差无关紧要,有算法处理
}while(差值 > 阈值);

我不知道我这么做是否合理?
总感觉不对

请大虾们帮助
谢谢

更正:

//主机端程序
Host_Fun(params){
定义主机端和设备端变量,开辟主机端和设备端空间;
复制初始矩阵以及其他变量值到设备的global memory中;
kernel<<<m,n>>>(params);
回收空间;
}

//设备端程序
global void
kernel(params){
shared float newMatrix;
定义和初始化差值和阈值等各种变量;
while(差值 > 阈值){
每个线程根据迭代公式计算新的值;
将新的值写入newMatrix中;
__Syncthreads();
差值 = newMatrix - oldMatrix;
}
将收敛后的矩阵复制回主机;
}

好像没什么问题:D

现在我又发现一个问题,当矩阵比较大的时候
shared memory是放不下的,我的shared memory只有16KB
这样,我应该把矩阵放在哪里?
constant memory也只有64KB,估计也不够用
如果放在global中的话,那怎么同步?没法做差了啊

cudaMalloc()这样直接申请不行么?

怎么个cudaMalloc法?
我还不知道怎么在GPU上操作显存

[

不好意思,上次没注意看你这和第一段不一样了。这样的话,我感觉你程序可以这样改,不知是否可行
main()
{
申请内存参数
cudaMalloc((void**)&d_Matrix, sizeof(Matrix));
cudaMemset(d_Matrix, 0, sizeof(Matrix));
cudaMemcpy(d_Matrix,newMatrix,sizeof(Matrix),cudaMemcpyHostToDevice);
do {
kernel<<<m,n>>>();//kernel里计算出新的矩阵
cudaThreadSynchronize();//这里同步
计算新旧矩阵差值;
把新的矩阵传值给旧的矩阵;
}while(判断条件)
}
:D这个和你最初那个想法一样,但是我看了下你更正那个,和这个有区别了

恩,现在我在按后面更正的那个写代码,发现还是有很多问题的
现在又准备按最开始的思路写
也就是你说的这样
对于这个算法,我一直在纠结,如果进行了很多次循环,启动核函数是不是开销很大?

用了那个同步,效率低是肯定的了。
开销嘛,应该不会吧,只是多次循环而已,不至于占用着那个线程一直不放。
现在就是你得多申请一个临时显存区域存放得到的矩阵,然后还要把得到的矩阵赋值回最原先矩阵。或者你直接改变传入参数值。感觉这一步比较麻烦。
不过,迭代算法就是如此吧。想不到什么好的解决办法了。

恩,谢谢
我先这样试试
回头效率问题,再慢慢琢磨
有问题再请教,呵呵

呵呵 客气了.
我也是入门没多久,跑来这里互相学习呢.大家一起进步,呵呵

这里我在想
为什么在核函数调用结束之后还用一个线程同步函数?
有必要吗?

你意思在kernel里加入_syncthread?
那样的话应该就没有必要了。
如果你的矩阵太大,一个线程块内放不下,开了多个线程块没法用_syncthread,应该就要用这个了吧。
不知道理解得对不对

恩,矩阵大的时候,一个block是不够的
我的block是256的
看来还是得在核函数之后用同步
呵呵

我觉得楼主的主要问题还不是在同步。
因为shared_memory有限,很难把一个整个矩阵放在其中。一般只能使用global_memory。

至于同步关系,还是看调用内核函数的方式是同步调用还是异步调用,这个有区别。

恩,你说对了
共享显存放不下整个矩阵,所以我准备把初始矩阵放在常数存储器上64KB,应该还是够的
如果不够,再申请放在global中

会为多文件写makefile吗?

这两天去厂房了.这个真不会,没弄过.

呵呵,我发现就只要按模板写就可以了
貌似不要自己写命令
我还在试