有两个问题想请教一下:
1、对于一个计算,下一步的计算需要用到上一步计算得到的数据,这样的情况应该如何进行并行化?
2、一个三维数组,计算其中任意一个点时都需要访问这个点周围的点,如已知点坐标(2,2,2),要访问点(1,2,2,)、(3,2,2)、(2,1,2)、(2,3,2)、(2,2,1)、(2,2,3)。这种对存储器的访问用什么方法可以实现合并访问?
LZ您好:
1:请尝试在每一步内部实现并行化。
2:您可以使用texture来加速访存操作。
大致如上,祝您好运~
以及补充下ice的:
如果您的“一步”计算规模较小(例如一个block即可), 那么您可以考虑多个这种“一步一步”的计算同时进行。反之如果不是,请无视此建议。
多谢两位版主的指导!正如横扫版主所说的,我的每一步的计算规模确实是较小,对于版主所说的“可以考虑多个这种“一步一步”的计算同时进行”我该怎么理解呢?附:我的问题是这样的,需要对网格中的每个点进行计算,每个点的计算又需要访问到周围的几个点,下一个点的计算需要用到上一个点的计算结果。
LZ您好:
1:横扫斑竹的意思大致上是“任务并行”的含义,即,您一个“一步一步”计算的任务虽然无法并行,但是如果您有多个这样的任务互不影响,那么可以把多个这种任务一起拿来跑。
2:目测您这种是某种差分的迭代算法。一般这种算法点数都是较大的,而且会保证每个点本次迭代都只依赖本点和周围点上一步的结果,因此各点可以互相无影响地并行计算。
但如果您的算法是严格地index+1处的值依赖index处值本次迭代的结果,那么似乎无法直接并行,请您考虑下您的算法是否可以修改。
大致如此,请您考虑。
祝您好运~
好的,看来是需要考虑修改算法了。另外,我尝试了二维纹理绑定,但是结果发现计算时间比直接从全局存储器访问数据的时间要长好多,想请教一下这是什么原因?
lz,我也在弄差分gpu并行化。针对你的问题,可以考虑将三维数组一维化,就是将三维数组直接用一维线性全局内存来代替。这个我在二维上试过了,我是用来学习二维声波正演的,该方法可以实现并行,速度比cpu上快个5 6倍。我现在在思考怎么在gpu申请真正的二维数组(如A【I】【J】),可以直接通过下标就能进行调用的。希望能相互交流下
楼主您好,建议新问题单独发贴。
您可以使用二维数组的,假设您需要一个float A[HEIGHT][WIDTH]的数组,您可以这样处理:
global void kim_long(float (*p)[WIDTH])
{
//即可直接使用p[y]
}
您可以这样分配空间:
float (*p)[WIDTH];
cudaMalloc(&p, HEIGHT * WIDTH * sizeof(float));
kim_long<<<>>>(p);
即可。
感谢来访。
非常感谢斑竹“横扫千军”!