static local shared memory定義在kernel函數中,只在該kernel中可見
__global__ void kernelFunc() { __shared__ Type data; ... }
static global shared memory定義在文件中的任何kernel外,對所有kernel可見
__shared__ Type data; __global__ void kernelFunc() { ... }
dynamci shared memory要在變量聲明前添加extern關鍵字,動態共享內存必須是一維的,可以定義爲局部或全局的。一個kernel只能有一段動態共享內存,其大小在調用kernek時指定
__global__ void kernelFunc() { extern __shared__ Type data[]; ... } int main() { kernelFunc <<<gridDim,blockDim,sharedMemArrLength>>> (); }
bank conflict指的是同一線程束內多個線程訪問同一個bank對應的不同內存地址,通俗的講,就是訪問了不同行的同一列地址。bank width決定了內存操作的粒度,開普勒架構中,可以設置爲4-byte或8-byte,較大的bank width會提高bank conflict的機率,但也能得到較高的帶寬
cudaError_t cudaDeviceGetSharedMemConfig(cudaSharedMemConfig *pConfig); cudaError_t cudaDeviceSetSharedMemConfig(cudaSharedMemConfig config);
L1 cache和shared memory共享同一塊on-chip memory,可以手動配置某個設備上所有或者單個SM上L1 cache和shared memory的大小
cudaError_t cudaDeviceSetCacheConfig(cudaFuncCache cacheConfig); cudaError_t cudaFuncSetCacheConfig(const void* func,enum cudaFuncCacheca cheConfig);
共享內存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.