2013-09-06 6 views
0

Я новичок в cuda c..i написал базовую программу умножения матрицы с использованием общей памяти ... но проблема в том, что я не могу увеличить размер матрицы за пределами 288, и если я это сделаю, я получаю ошибку переполнения стека. .i имеют NVIDIA GTX 480 gpu..could кто пожалуйста скажите мне, как увеличить размер и какие ошибки я делаюcuda matrix умножение размер

#define tile_width 16 
#define width 288 
void mat_mul_kernel1(int *a,int *b,int *c) 
{ 
    int row= blockIdx.y*blockDim.y + threadIdx.y; 
    int col= blockIdx.x*blockDim.x + threadIdx.x; 
    int pvalue=0; 
    __shared__ int sha[tile_width*tile_width]; 
    __shared__ int shb[tile_width*tile_width]; 

    for (int m=0;m<width/tile_width;m++) 
    { 
     sha[threadIdx.y*tile_width+threadIdx.x]=a[row*width+(m*tile_width)+threadIdx.x]; 
     shb[threadIdx.y*tile_width+threadIdx.x]=b[(m*tile_width+threadIdx.y)*width+col]; 
     __syncthreads(); 
     for (int k=0;k<tile_width;k++) 
      pvalue+=sha[threadIdx.y*tile_width+k]*shb[k*tile_width+threadIdx.x]; 
     __syncthreads(); 
    } 

    c[row*width+col]=pvalue; 
} 
int main() 
{ 
    int a[width*width],b[width*width],c[width*width]; 
    int *deva,*devb,*devc; 
    float etime; 
    for (int i=0;i<width;i++) 
    { 
     for(int j=0;j<width;j++) 
     { 
      a[i*width+j]=1; 
      b[i*width+j]=1; 
     } 
    } 
    cudaEvent_t start,stop; 
    cudaEventCreate(&start); 
    cudaEventCreate(&stop); 
    dim3 dimGrid((int)(width)/tile_width,(int)(width)/tile_width); 
    dim3 dimBlock(tile_width,tile_width); 
    cudaError_t error; 
    error=cudaMalloc((void**)&deva,width*width*sizeof(int)); 
    if(error!= cudaSuccess) 
    { 
     printf("error at a allocation"); 
     exit(EXIT_FAILURE); 
    } 
    error=cudaMemcpy(deva,a,width*width*sizeof(int),cudaMemcpyHostToDevice); 
    if(error!= cudaSuccess) 
    { 
     printf("error at a copying"); 
     exit(EXIT_FAILURE); 
    } 
    error=cudaMalloc((void**)&devb,width*width*sizeof(int)); 
    if(error!= cudaSuccess) 
    { 
     printf("error at b allocation"); 
     exit(EXIT_FAILURE); 
    } 
    error=cudaMemcpy(devb,b,width*width*sizeof(int),cudaMemcpyHostToDevice); 
    if(error!= cudaSuccess) 
    { 
     printf("error at b copying"); 
     exit(EXIT_FAILURE); 
    } 
    error=cudaMalloc((void**)&devc,width*width*sizeof(int)); 
    if(error!= cudaSuccess) 
    { 
     printf("error at c allocation"); 
     exit(EXIT_FAILURE); 
    } 
    cudaEventRecord(start,0); 
    mat_mul_kernel1<<<dimGrid,dimBlock,tile_width*tile_width*sizeof(int)>>>(deva,devb,devc); 
    cudaEventRecord(stop,0); 
    cudaEventSynchronize(stop); 
    cudaEventElapsedTime(&etime,start,stop); 
    error=cudaMemcpy(c,devc,width*width*sizeof(int),cudaMemcpyDeviceToHost); 
    if(error!= cudaSuccess) 
    { 
     printf("error at c copying"); 
     //exit(EXIT_FAILURE); 
    } 
    cudaFree(deva); 
    cudaFree(devb); 
    cudaFree(devc); 
    printf("ElapsedTime %f milliseconds",etime); 
} 

ответ

4

проблема вы видите, не имеет ничего общего с CUDA. Проблемы - это ваши массивы a, b, c. Они выделяются в стеке. Они имеют размер 288 x 288 x siezof(int) x 3, что приводит к 972kB (sizeof(int) = 4 byte). Поэтому я предполагаю, что вы набрали стандартный максимальный размер стека, который, насколько мне известно, лежит на уровне 1 МБ.

Попробуйте выделить ваши массивы динамически в куче

int* a = (int*) malloc(width * width * sizeof(int)); 

и освободить память в конце

free(a); 
+0

спасибо очень much..it сейчас работает – saravanakkumar

+2

@saravanakkumar you'r приветствовать. пожалуйста, обратите внимание на этот ответ в качестве принятого ответа. –

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