c++ - 二维数组的CUDA动态共享内存分配

标签 c++ arrays cuda gpu-shared-memory

我想在 CUDA 的共享内存中分配一个 2D 数组。 我知道要分配一维共享内存数组,您必须将每个 block 的大小作为参数传递给内核。

我也知道不可能在共享内存中动态创建实际的二维数组。

但是我想知道如果其中一个维度已知,这是否可以完成。

extern __shared__ int array[COMPILE_TIME_SIZE][];

这可以做到吗?如果是这样,我如何传递第二个维度的大小?

最佳答案

完全这样做,首先使用已知的维度(最高阶 - 第一个方括号条目)是不可能的,因为编译器可能无法正确实现寻址。

但是,可以仅在编译时设置第二个参数。下面是一个示例代码:

extern __shared__ int shared2Darray[][17] ;

__global__ void kernel(int* output)
{
    shared2Darray[threadIdx.y][threadIdx.x] = threadIdx.x + 2*threadIdx.y ;
    __syncthreads();
    output [threadIdx.y * blockDim.x + threadIdx.x] = shared2Darray[threadIdx.y][threadIdx.x] ;
    __syncthreads();
}

int main()
{
    int* h_output, *d_output ;

    cudaMalloc(&d_output, 16*16*sizeof(int));

    kernel<<<1, dim3(16,16,1), 16*17*sizeof(int)>>> (d_output) ;

    h_output = new int[16*16] ;
    cudaMemcpy (h_output, d_output, 16*16*sizeof(int), cudaMemcpyDeviceToHost) ;

    cudaDeviceReset();

    for (int x = 0 ; x < 16 ; ++x)
    {
        for (int y = 0 ; y < 16 ; ++y)
        {
            if (h_output[y*16+x] != x+2*y)
                printf ("ERROR\n");
        }
    }

    printf ("DONE\n");

    delete[] h_output ;

    return 0 ;
}

数组的大小由三尖括号表示法中的共享内存参数定义。因此,第二维的大小是通过将共享内存大小(以字节为单位)除以单个条目的大小(以字节为单位)得出的。

关于c++ - 二维数组的CUDA动态共享内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36872821/

相关文章:

sql - PostgreSQL 第二个查询基于第一个查询的数组类型结果。即用数组链接查询

r - R 中的 gputools - 无效设备功能错误

CUDA:停止所有其他线程

frameworks - CUDA 和 OpenCL 之前的 GPGPU

c++ - 搜索多维数组

c++ - 使用 ArrayFire 中的 OpenGL

javascript - 在 Javascript 中使用另一个数组对数组进行排序

C++ const struct &variable 产生缺少的标签名称

c++ - 如何查看目标文件中的符号?

c - 函数不会打印特定列表