用户
 找回密码
 立即注册
发表于 2013-11-3 22:59:34
ice 发表于 2013-11-3 21:11
LZ您好:

目测您似乎没有理解玫瑰斑竹的意思,我来稍微再解释一下:

ice 你好,谢谢的详细解答,其实在我的应用是一个迭代算法,
(1)zercoef是一个长度为65的向量,它所占的字节数为65*sizeof(double)= 520B,在每一轮迭代过程中zercoef都要更新,但是在每轮迭代中多个kernel都要用到同一个zercoef。
(2)wf65是一个256*256*65的一个三维矩阵,你可以把它想象成一个长=256 宽=256 高=65的立方体,这个立方体在我的迭代开始到结束都是固定的,共占用字节数为256*256*65*sizeof(double)= 32MB。
像我这样的应用,我觉得我的应用中对wf65的访问占用时间太多了,zercoef相对要少很多,你觉得这两个变量的访问怎么安排比较合理呢?谢谢啦!
使用道具 举报 回复 支持 反对
发表于 2013-11-3 23:19:48
建议楼主看看编程指导中的SHFL intrinsic相关的例程,对你很有用!
使用道具 举报 回复 支持 反对
发表于 2013-11-3 23:56:32
quanzhang100 发表于 2013-11-3 22:59
ice 你好,谢谢的详细解答,其实在我的应用是一个迭代算法,
(1)zercoef是一个长度为65的向量,它所占 ...

LZ您好:

看到您最新的补充说明,答复如下:

1:如果您的“每轮迭代”指的是host端
   for()
{   kernel 1;
    kernel 2;
   ...
    kernel n;
}
以及每次host端的循环中,您的zercoef[]都是不变的,那么前面给您的对zercoef[]的处理建议都是可行的,您可以对zercoef[]使用高速的constant cache或者shared memory进行缓冲。

以及,您这里说的“迭代”和您1#代码中分拆循环的理由中的“迭代”完全无关。您kernel中并无体现出修改zercoef[]的地方,您kernel内的循环是每个线程独立跑的,完全可以unroll。
使用道具 举报 回复 支持 反对
发表于 2013-11-4 00:09:08
quanzhang100 发表于 2013-11-3 22:59
ice 你好,谢谢的详细解答,其实在我的应用是一个迭代算法,
(1)zercoef是一个长度为65的向量,它所占 ...

2:根据您1#给出的代码,您对wf65[]的使用是合并访问的,一般来说初步就可以了。

如果您的算法确实是访存密集型的,那么您可以考虑以下的几点:

a) 您说您的一次迭代中,会有多个kernel,而如果每个kernel都需要读取wf65[],那么您可以考虑下,在您的算法框架下,能否将多个kenrel合并为一个kernel,这样可以减少对wf65[]全局读取的次数。

b) 以及,如果可能,wf65[]的数据可否在GPU端就地生成,而不用访存读取,一般来说GPU的计算资源是富余的,付出一些计算代价是可以接收的。

c) 一般来说32MB这么多的数据想直接缓冲到GPU的高速cache中是不行的。

大致如此,祝您晚安~
使用道具 举报 回复 支持 反对
发表于 2013-11-4 16:22:16
ice 发表于 2013-11-4 00:09
2:根据您1#给出的代码,您对wf65[]的使用是合并访问的,一般来说初步就可以了。

如果您的算法确实是访 ...

谢谢ice版主
使用道具 举报 回复 支持 反对
发表于 2013-11-4 16:24:09
quanzhang100 发表于 2013-11-4 16:22
谢谢ice版主

不客气的,欢迎您常来论坛~
使用道具 举报 回复 支持 反对
12
发新帖
您需要登录后才可以回帖 登录 | 立即注册