用的 texture<uchar, 1, cudaReadModeElementType> texRef;
绑定线性内存:
cudaBindTexture(0,texRef,dev_armL );
aggregateH<<<blockaggh,threadaggh>>>(dev_initcost,dev_tmpcost,dev_armL );
cudaUnbindTexture(texRef);
global void aggregateH(float* restrict Icost,float* restrict Hcost,uchar* restrict arm)
{
。。。
//纹理
// l = tex1Dfetch(texRef, blockIdx.xIMG_W+count+tx);
// r = tex1Dfetch(texRef, blockIdx.xIMG_W+count+tx+IMG_HxW);
//全局变量
l=arm[blockIdx.xIMG_W+count+tx];
r=arm[blockIdx.xIMG_W+count+tx+IMG_HxW];
。。。
}
在Fermi上,L1 cache的带宽本就比texture cache带宽大一些,所以有可能出现用texture更慢。不知您用的什么GPU?
其他一些计算能力的GPU,缓存特点各有不同,这个以前有帖子建议过,请您查询。
这个是fermi核心的GPU。
如果您的机器上还有CUDA toolkit 4.x的话,可以找到fermi tuning guide看看,(如果我没记错的话)。
祝您调整顺利。
嗯,我用的是cuda 5.0
那么这样的话,纹理还有什么优势?
5.0似乎没有附带该pdf,你可以找一下看。
纹理有没有优势是和硬件单元相关的,和CUDA 5.0还是4.x没关系,和GPU的硬件计算能力,(SM1.X?2.X?3.0?3.5等)有关。FERMI是一个激进的偏重通用计算的架构,L1cache的带宽被设计的更大;但是更早的硬件(SM1.x)和更偏重于图形用途的硬件(SM 3.0)使用纹理会更快一些。
以及,纹理在一些特殊寻址类型上有特殊的福利。
大致如此,因为我不怎么使用纹理,一些细节内容,有待其他人补充了。
祝您好运~
善哉。ICE说的很对。
只建议楼主在1.x和3.x上使用纹理读取。而在2.x不建议,除非你的测试表明你用了纹理读取后更快。
回到楼主1楼的例子,既然测试表明在您的2.1的卡上更慢,那么果断还是不使用的好。