2013-10-05 3 views
0

Я написал код CUDA с использованием разделяемой памяти, как это:ошибка в разделяемой памяти 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 и напечатать значение ПЛИТКИ, и это выходит 1. так почему эта ошибка?

ответ

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]; 

    ... 
} 
+0

так вы имеете в виду в то время TILE компиляции не является постоянной, но до сих пор blockDimx.x, которая еще не оценена в 1? – user25108

+0

@ user25108 Да, проблема здесь в том, что значение 'TILE' неизвестно во время компиляции. – JackOLantern

Смежные вопросы