CUDA 的 __shared__ 内存什么时候有用

作者:编程家 分类: c++ 时间:2025-08-17

CUDA中的__shared__内存

CUDA(Compute Unified Device Architecture)是一种并行计算平台和编程模型,用于利用GPU(Graphics Processing Unit,图形处理器)进行高性能计算。在CUDA中,__shared__内存是一种特殊的内存类型,位于GPU的多处理器(Multiprocessor)上,在并行计算中起到了非常关键的作用。

__shared__内存的作用

__shared__内存是一种位于多处理器上的共享内存,其作用是为并行计算中的线程提供一个高效的共享数据存储区域。相比于全局内存,__shared__内存的访问速度更快,可以大幅度提高程序的性能。

在并行计算中,每个线程块(Thread Block)都有自己的__shared__内存,线程块中的线程可以通过__shared__内存进行高速的数据交换和通信。这对于需要共享数据的并行计算任务非常重要,可以减少全局内存的访问次数,提高计算效率。

__shared__内存的使用场景

__shared__内存的使用场景非常广泛,特别是在以下几种情况下尤为有用:

1. 数据共享:当多个线程需要访问相同的数据时,可以将这些数据存储在__shared__内存中,以便线程之间进行数据交换和共享,减少全局内存的访问次数。

2. 数据重用:当多个线程需要进行相同的计算操作时,可以将计算结果存储在__shared__内存中,以便其他线程复用,避免重复计算和全局内存的访问。

3. 数据缓存:当多个线程需要访问相邻的内存区域时,可以将这些数据缓存到__shared__内存中,以提高访问速度。

案例代码

下面是一个使用__shared__内存的简单案例代码,用于计算向量的加法:

c++

#include

#define N 1024

__global__ void vectorAdd(int *a, int *b, int *c)

{

__shared__ int sharedMemory[N];

int tid = blockIdx.x * blockDim.x + threadIdx.x;

if (tid < N)

{

sharedMemory[tid] = a[tid] + b[tid];

c[tid] = sharedMemory[tid];

}

}

int main()

{

int a[N], b[N], c[N];

int *d_a, *d_b, *d_c;

// 分配GPU内存

cudaMalloc((void **)&d_a, sizeof(int) * N);

cudaMalloc((void **)&d_b, sizeof(int) * N);

cudaMalloc((void **)&d_c, sizeof(int) * N);

// 初始化输入数据

for (int i = 0; i < N; i++)

{

a[i] = i;

b[i] = i;

}

// 将输入数据拷贝到GPU内存

cudaMemcpy(d_a, a, sizeof(int) * N, cudaMemcpyHostToDevice);

cudaMemcpy(d_b, b, sizeof(int) * N, cudaMemcpyHostToDevice);

// 启动CUDA核函数

vectorAdd<<<(N + 255) / 256, 256>>>(d_a, d_b, d_c);

// 将计算结果从GPU内存拷贝回主机内存

cudaMemcpy(c, d_c, sizeof(int) * N, cudaMemcpyDeviceToHost);

// 打印计算结果

for (int i = 0; i < N; i++)

{

printf("%d + %d = %d\n", a[i], b[i], c[i]);

}

// 释放GPU内存

cudaFree(d_a);

cudaFree(d_b);

cudaFree(d_c);

return 0;

}

在上述代码中,__shared__内存被声明为一个大小为N的整型数组sharedMemory。在核函数vectorAdd中,每个线程块都有自己的sharedMemory,并且使用该共享内存进行向量的加法计算。计算结果存储在sharedMemory中,并且最终拷贝回主机内存。

通过使用__shared__内存,可以减少全局内存的访问次数,提高向量加法的计算效率。

__shared__内存是CUDA中非常重要的一种内存类型,用于为并行计算中的线程提供一个高效的共享数据存储区域。通过合理地使用__shared__内存,可以减少全局内存的访问次数,提高程序的性能。在并行计算中,合理使用__shared__内存是优化CUDA程序的关键之一。