簡體   English   中英

為什么我的內核的共享內存似乎被初始化為零?

[英]Why does my kernel's shared memory seems to be initialized to zero?

正如在這個共享內存數組默認值問題中提到的,共享內存是非初始化的,即可以包含任何值。

#include <stdio.h>

#define BLOCK_SIZE 512

__global__ void scan(float *input, float *output, int len) {
    __shared__ int data[BLOCK_SIZE];

    // DEBUG
    if (threadIdx.x == 0 && blockIdx.x == 0)
    {
        printf("Block Number: %d\n", blockIdx.x);
        for (int i = 0; i < BLOCK_SIZE; ++i)
        {
            printf("DATA[%d] = %d\n", i, data[i]);
        }
    }

}

int main(int argc, char ** argv) {
    dim3 block(BLOCK_SIZE, 1, 1);
    dim3 grid(10, 1, 1);
    scan<<<grid,block>>>(NULL, NULL, NULL);
    cudaDeviceSynchronize();
    return 0;
}

但是為什么在這段代碼中它不是真的,而且我不斷地將共享內存歸零?

DATA[0] = 0
DATA[1] = 0
DATA[2] = 0
DATA[3] = 0
DATA[4] = 0
DATA[5] = 0
DATA[6] = 0
...

我使用發布調試模式進行了測試:“-O3 -arch=sm_20”、“-O3 -arch=sm_30”和“-arch=sm_30”。 結果總是一樣的。

tl;dr:共享內存未初始化為 0

我認為您對共享內存初始化為0猜想是有問題的。 試試下面的代碼,這是對你的稍微修改。 在這里,我調用內核兩次並更改data數組的值。 第一次內核啟動,對“未初始化”值data將是所有0的。 內核啟動第二次的“未初始化”值data將來自不同0的。

我認為這取決於共享內存是 SRAM,它表現出數據剩余的事實。

#include <stdio.h>

#define BLOCK_SIZE 32

__global__ void scan(float *input, float *output, int len) {

    __shared__ int data[BLOCK_SIZE];

    if (threadIdx.x == 0 && blockIdx.x == 0)
    {
        for (int i = 0; i < BLOCK_SIZE; ++i)
        {
            printf("DATA[%d] = %d\n", i, data[i]);
            data[i] = i;
        }

    }
}

int main(int argc, char ** argv) {
    dim3 block(BLOCK_SIZE, 1, 1);
    dim3 grid(10, 1, 1);
    scan<<<grid,block>>>(NULL, NULL, NULL);
    scan<<<grid,block>>>(NULL, NULL, NULL);
    cudaDeviceSynchronize();
    getchar();
    return 0;
}

暫無
暫無

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

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