关于访问conflict的问题

各问大神们,你们好!

我这边有一个问题:有两张图像A和B,每张的大小为10241280,我用float的形式分别存在两个texture变量里面,然后A和B中应用区域相关求取对应点:过程为,在A中选择一个像素点p,然后在B中对应的一行上取N个像素,然后以B中每个像素为中心,取一个大小为NN的矩形与A中以p为中心的N*N的矩形进行相关计算。现在我将A中每个像素与B中一串像素求相关的运算放到block中(A中有几个像素就申请多少个block),然后每个block中的每个线程分别运算p矩形框和B中这一行上每个像素的矩形框求取相关值,这个放置在共享内存中进行。现在有这个几个问题:

(1)如此block运算,并行时相邻像素对应的矩形框访问有重叠,这样在访问的时候是不是会出现conflict,从而导致效率降低?如果是,在我这种情况有什么好的解决措施嘛?

(2)纹理内存一般比globle内存在访问上速度有多大差别?

(3)起初我是想将图像放到constant里面的,但是它的容量太小,如果我分批添加进去,就不断有cpu和gpu的交换,我担心速度反而会更低。不知道这种担心是不是多余?

求斑竹们不吝赐教!

LZ您好:

1:严格说,是否有shared memory的bank conflict取决于您对shared memory的用法。以及您的问题可以容易给出没有bank conflict的实现,因此原则上讲,这里消除bank conflict不成问题。

2:用texture 带宽更高,但是延迟更大。以及无法直接回答您这里的“速度”变化。

3:constant 是有容量限制的,以及分成多次启动kernel使用,每次重新更新constant的值可能是得不偿失的。您可以继续考虑您当前的思路,即使用global memory并考虑其他各种高速cache手段加速。

大致如此,祝您编码顺利~

谢谢您的指点,我大体明白了!!:slight_smile: