簡體   English   中英

在CUDA中共享內存? CODE如何運作?

[英]Share memory in CUDA ? How does it CODE work?

我有一個程序來計算array的值:array A:有32個元素,值形式為0->31。array B:有16個元素,value = 0;

**我想按照此規則計算B [i]的值:B [i] = A [i * 2] + A [i * 2 + 1]; 我從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); 
}

因此,我想問一個問題:按照上面的代碼,我在內核中使用Share memory int smnA [16],並使用2個塊= 2 * 16線程, 因為每個線程都執行一個內核 (來自Seland.pdf)=> 共享內存中有16x16 = 256個元素 =>這沒有邏輯!

沒有您的假設是錯誤的。 因為共享內存可用於同一塊內線程的交互,所以共享內存也分配給整個線程塊。 在您的示例中,每個線程塊將使用16個整數元素。 您的內核總共需要32個整數元素才能同時運行所有線程塊。 即使它不一樣,但也許您可以將其與C代碼中的靜態變量進行比較。

如果您在內核中編寫類似以下代碼示例的內容,則每個線程將使用它自己的包含16個元素的數組。 但是該數組不能被其他線程訪問(例外是隨機播放指令)。

__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.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM