CUresult cuFuncSetCacheConfig ( CUfunction hfunc, CUfunc_cache config )
Parameters
hfunc - Kernel to configure cache for
config - Requested cache configuration
Returns CUDA_SUCCESS, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT
这个函数用于设置CUDA核函数的首选缓存配置。
主要功能
在支持动态L1缓存/共享内存分配的GPU上,这个函数允许程序员为特定的核函数(kernel)指定L1缓存和共享内存的分配偏好。
工作原理
资源分配背景
- 某些GPU架构(如Tesla、Fermi、Kepler等)中,L1缓存和共享内存共用相同的硬件资源
- 总的片上内存资源是固定的,可以动态分配给L1缓存和共享内存
- 默认情况下通常使用均衡分配
配置选项
- CU_FUNC_CACHE_PREFER_NONE - 无偏好(使用上下文默认设置)
- CU_FUNC_CACHE_PREFER_SHARED - 优先分配更多给共享内存
- CU_FUNC_CACHE_PREFER_L1 - 优先分配更多给L1缓存
- CU_FUNC_CACHE_PREFER_EQUAL - 平均分配
使用场景
何时使用PREFER_SHARED
// 核函数需要大量共享内存时
// 例如:矩阵乘法、卷积运算等需要数据重用的算法
cuFuncSetCacheConfig(myKernel, CU_FUNC_CACHE_PREFER_SHARED);
何时使用PREFER_L1
// 核函数内存访问模式不规则,L1缓存命中率重要时
// 例如:图算法、稀疏矩阵运算
cuFuncSetCacheConfig(myKernel, CU_FUNC_CACHE_PREFER_L1);
重要注意事项
- 只是偏好设置:驱动可能会根据实际情况调整
- 上下文覆盖关系 :
- 函数级设置 > 上下文级设置(除非设置为PREFER_NONE)
- 上下文设置使用
cuCtxSetCacheConfig
- 可能引入同步:切换不同的缓存配置可能需要设备同步
- 架构限制:在固定L1/共享内存的GPU上无效(如Maxwell及之后的部分架构)
典型使用流程
// 加载模块和函数
CUmodule module;
CUfunction kernel;
cuModuleLoad(&module, "mykernel.ptx");
cuModuleGetFunction(&kernel, module, "myKernel");
// 设置核函数的缓存偏好
cuFuncSetCacheConfig(kernel, CU_FUNC_CACHE_PREFER_SHARED);
// 准备参数并启动核函数
// ...
这个函数主要用于优化性能,让程序员可以根据核函数的具体内存访问特性来调整硬件资源分配。