fermi 结构的共享存储器和L1缓存调配如何编程实现?

FERMI每个SM均拥有64KB容量的片上存储器,这部分存储器可配置为16KB的1级高速缓存外加48KB共享存储器,或配置为16KB共享存储器外加48KB的1级高速缓存,这就是可调配性。请问在程序中用哪个函数调配?
谢谢

cudaFuncSetCacheConfig cudaDeviceSetCacheConfig

好的,我试试,谢谢了

楼主您好,你的要求可以如下实现:

(48KB L1 + 16KB shared配置)
cudaDeviceSetCacheConfig(cudaFuncCachePreferL1);

反之: 16KB L1 + 48KB shared memory配置:
cudaDeviceSetCacheConfig(cudaFuncCachePreferShared);

此外你还可以单独为您的1个kernel配置, 而不是在context里全局配置:
例如如下分别配置16KB和48KB的L1,为你的一个kernel函数:
cudaFuncSetCacheConfig(your_kernel, cudaFuncCachePreferShared);
cudaFuncSetCacheConfig(your_kernel, cudaFuncCachePreferL1);

请注意!切换L1/Shared配置时,会影响到你的多个kernel之间的并行执行,如果你只是上一个大kernel, 这点影响可以忽略。

请注意!如果你用kepler卡,你可以可以选择shared/L1是平衡的配置(32KB+32KB), 但它们和fermi的L1作用不同,以及,你询问的是fermi. 请着重考虑上文2种。

感谢楼主莅临!
祝节日快乐!

谢谢了,试过了可以使用

服务您是我的荣幸!

我想问下,fermi下同一个warp中的前半束和后半束有没有可能出现访问冲突问题?因为我看到cuda4.0里有一句话:
“共享存储器有32个存储体,存储体的组织使得相邻的32位字被分配到相邻的存储体中。每个存储体带宽为每2个时钟周期32位字。因此不像低计算能力的设备,前半束内的线程和后半束的线程可能发生存储体冲突。”

但在紧接着的例子里(中间的访存方式却存在冲突):
[attach]3097[/attach]

然后在64位的访问中,文章中又说:
不像计算能力1.x的设备,像下面的方式访问double数组不会产生存储体冲突:
shared double shared[32];
double data = shared[BaseIndex + tid];

我感觉64位中的例子和图片中中间的访存方式非常相像,为什么一个有冲突,另外一个就没冲突呢?

请勿挖坟。如果疑问请自行发帖!

这已经是第三次警告您了!也将是最后一次。感谢配合。

(你的中间的问题的图片你没有给出。无法回答)

下一个问题:
在2.x中,shared double arr; 然后访问arr[tid];的确无bank conflict. 具体原理不知道。不过可以理解为硬件能特别处理了。需要注意的是。虽然此时用profiler看无bank conflict, 但需要2个周期才能取回数据。(每周期依然是128读取。性能是没变的。需要2个周期是因为你读取了256B。这个周期是按SM频率算的。按SP频率算,只有64B/cycle. 也就是2.x上shared memory的同频性能只有3.x的1/4。手册这里没说清楚。请以这里为准)。