在CUDA中共享内存?代码是如何工作的

Share memory in CUDA ? How does it CODE work?

本文关键字:何工作 工作 CUDA 共享 内存 代码      更新时间:2023-10-16

我有一个程序来计算数组的值:数组A:有32个元素,值从0 -> 31。数组B:包含16个元素,value = 0;

**我想计算B[I]的值:B[I]=A[I *2] + A[I *2+1];I从0到31 **我使用CUDA编程与我的示例代码:

Main.cu

 __global__ void Kernel(int *devB, int *devA)
    {  
    // Use share memory, 16 thread per block, so I use 16element for share memory in block 
    __shared__ int smA[16];
    //copy data from global memory to shared memory
    //1 thread copies 1 elementente
      smA[threadIdx.x] = devA[threadIdx.x + blockIdx.x * blockDim.x];
      __syncthreads(); 
    //8 thread in Block
      if (threadIdx.x < 8) 
    {
      devB[threadIdx.x + blockIdx.x * blockDim.x] = 
      smA[threadIdx.x * 2] + smA[threadIdx.x * 2 + 1];
    }
}

空白主要

void main()
{
int *A = (int*)malloc(sizeof(int) * 32);
int *B = (int*)malloc(sizeof(int) * 16);
for (int i = 0; i < 32; i++)
A[i] = i;

    int *devA = NULL;
    cudaMalloc((void**)&devA, sizeof(int) * 32);
    cudaMemcpy(devA, A, sizeof(int) * 32), cudaMemcpyHostToDevice);
    int * devB = NULL;
    cudaMalloc((void**)&devB, sizeof(int) * 16);
    dim3 block(16, 1, 1);
    dim3 grid(2, 1, 1);
    Kernel<<<grid, block>>>(devB, devA);
    //copy back data to host
    cudaMemcpy(B, devB, sizeof(int) * 16, cudaMemcpyDeviceToHost);
    for (int i = 0; i < 16; i++) printf("%d/t", b[i]);
    if (A != NULL) free(A);
    if (B != NULL) free(B);
    if (devA != NULL) cudaFree(devA);
    if (devB != NULL) cudaFree(devB); 
}

所以,我想问:按照上面的代码,我在内核中使用共享内存 int smnA[16],并使用2块= 2*16线程,因为每个线程执行一个内核(来自Seland.pdf)=>我将有16x16 = 256元素在共享内存 ?=>毫无逻辑!

不,你的假设是错误的。由于共享内存可用于同一块内线程的交互,因此也为整个线程块分配共享内存。在您的示例中,您将为每个线程块使用16个整数元素。内核总共需要32个整数元素来同时运行所有线程块。即使它不相同,但也许你可以将它与c代码中的静态变量进行比较。

如果你在内核中编写类似以下代码示例的东西,每个线程将使用它自己的包含16个元素的数组。但是这个数组不能被其他线程访问(shuffle指令除外)。

__globa__ void kernel (...)
{
  int array_single_thread[16]; // Every thread instance has it's own array.
  ...
  __shared__ int array_thread_block[16]; // Once allocated for complete thread block.
}