c - 为什么我的内核的共享内存似乎被初始化为零?

标签 c cuda gpu gpgpu nvidia

正如本文中提到的Shared Memory Array Default Value问题,共享内存未初始化,即可以包含任何值。

#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
...

我用 测试过发布 Debug模式 :“-O3 -arch=sm_20”、“-O3 -arch=sm_30”和“-arch=sm_30”。结果总是一样的。

最佳答案

tl;dr:共享内存未初始化为 0

我认为你对共享内存的猜想初始化为 0值得怀疑。试试下面的代码,这是对你的稍微修改。在这里,我调用内核两次并更改 data 的值。大批。内核第一次启动时,data 的“未初始化”值将全部0的。第二次启动内核时,data 的“未初始化”值将与 0 完全不同的。

我认为这取决于共享内存是 SRAM 的事实,其中展示了 data remanence .

#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;
}

关于c - 为什么我的内核的共享内存似乎被初始化为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22172881/

相关文章:

CSS剪辑使用GPU?

在一整秒内每 X 毫秒在一个值之间循环的条件

php - 在 php 上运行 exec 命令

c++ - cudaMallocHost 甚至无法分配最小的内存

cuda - 了解PTX指令mma.sync.aligned.m16n8k16.row.col.f32.f16.f16.f32的参数

CUDA cudaDeviceProp 构建 deviceQuery 示例时没有成员错误

installation - 无法安装特定的 JAX jaxlib GPU 版本

c - C中具有混合数据类型的指针矩阵

c - 使用信号量交换两个 fork 进程

parallel-processing - 为什么相同的 OpenCL 代码在 Intel Xeon CPU 和 NVIDIA GTX 1080 Ti GPU 上有不同的输出?