【问题标题】:error in cuda shared memory static allocationcuda共享内存静态分配错误
【发布时间】:2013-10-12 12:20:15
【问题描述】:

我用这样的共享内存编写了一个 CUDA 代码:

__global__ void matrix_mul_shared(float *ad,float *bd,float *cd,int N)
{
    float pvalue=0;
    int TILE=blockDim.x;
    int ty=threadIdx.y;
    int tx=threadIdx.x;

    //allocate shared memory per block
    __shared__ float ads[1][1];
    __shared__ float bds[1][1];

 .

。 . }

此代码有效,但以下代码失败;

__global__ void matrix_mul_shared(float *ad,float *bd,float *cd,int N)
{
    float pvalue=0;
    int TILE=blockDim.x;
    int ty=threadIdx.y;
    int tx=threadIdx.x;

    //allocate shared memory per block
    __shared__ float ads[TILE][TILE];
    __shared__ float bds[TILE][TILE];

 .
. 
.
}

编译器期望在我分配共享内存的行中保持不变。它说(我忘记了确切的错误,但它是这样的):

参数应该是常量

我可以使用 printf 并打印 TILE 的值,结果是 1。那么为什么会出现这个错误?

【问题讨论】:

    标签: c cuda gpu nvidia


    【解决方案1】:

    我认为您收到的错误是

    error: expression must have a constant value
    

    变量TILE 不是编译器所指意义上的常量。编译器要求在编译时作为共享内存数组的维度。

    一个可能的解决方案:

    #define TILE 16
    
    __global__ void matrix_mul_shared(float *ad,float *bd,float *cd,int N)
    {
        ...
    
        __shared__ float ads[TILE][TILE];
    
        ...
    }
    

    【讨论】:

    • 所以你的意思是在编译时 TILE 不是一个常数,但仍然是 blockDimx.x,它还没有被评估为 1?
    • @user25108 是的,这里的问题是TILE的值在编译时是未知的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多