2016-02-17 3 views
-1

У меня есть задание, которое требует от меня генерации матрицы Redheffer на графическом процессоре с использованием Cuda.создание матрицы рефефферов с использованием cuda

A Redheffer matrix1 is a matrix where each entry a[i][j] is defined by 
a[i][j] = 
1 if j = 1, 
1 if j is divisible by i 
0 otherwise. 

Вот мой код

#define SIZE = 20000 
    #define BLOCK_WIDTH 16 

    /* Launch the CUDA kernel */ 
    int numBlocks = ceil(SIZE/BLOCK_WIDTH); 
    dim3 dimGrid(BLOCK_WIDTH,BLOCK_WIDTH,1); 
    dim3 dimBlock(numBlocks,numBlocks,1); 
    redhefferMatrix<<<dimGrid, dimBlock>>>(d_M, SIZE); 

У меня есть код, чтобы проверить, если выход правильно, то вернуть сообщение об ошибке, когда значение матричного элемента вычисляется не является правильным. Когда я запускаю свою программу, я получаю эту ошибку.

GPU number 0 is assigned to this job 
    Row 0 column 5000 is incorrect. Should be:1 Is actually: 0 

Моя логика для вычисления значений является

int Row= blockIdx.y*blockDim.y + threadIdx.y; 
int Col= blockIdx.x*blockDim.x + threadIdx.x; 
. 
. 
if(i < 20000 && j < 20000) 
{ 

    { 

     if(j == 1 || j % i == 0) 
      d_M[i*SIZE+ j] = 1; 
     else 
      d_M[i*SIZE+ j] = 0; 
    } 
} 

Может кто-нибудь дать мне представление о том, где я мог бы быть неправильно. Заранее спасибо.

ответ

2

Поскольку вы не предоставили полный код, невозможно определить все проблемы, которые могут возникнуть. Но у вас есть неправильное толкование блока и сетки размеров (вы их в обратном порядке):

#define SIZE = 20000 
#define BLOCK_WIDTH 16 

/* Launch the CUDA kernel */ 
int numBlocks = ceil(SIZE/BLOCK_WIDTH); 
dim3 dimGrid(BLOCK_WIDTH,BLOCK_WIDTH,1); 
dim3 dimBlock(numBlocks,numBlocks,1); 
redhefferMatrix<<<dimGrid, dimBlock>>>(d_M, SIZE); 

Первый параметр конфигурации ядра должны быть размеры сетки с точки зрения количества блоков (по х и у, в этом случае). Ваш первый конфигурационный параметр ядра - dimGrid, который вы определили как количество dim3(BLOCK_WIDTH,BLOCK_WIDTH), то есть 16x16 блоков. Это не то, что вы намеревались, я не думаю, но фактически не незаконно.

Ваш второй параметр конфигурации ядра должен быть размером блока с точки зрения количества потоков (в этом случае в x и y). Второй параметр ядра - dimBlocks, который вы определили как количество dim3(20000/16, 20000/16), т. Е. Потоки 1250x1250. Это незаконно, так как CUDA threadblocks ограничены общей из 1024 нитей, то есть произведение размеров не может превышать 1024.

Так что ваш запуск ядра является незаконным, и ядро ​​даже не работает. Если вы используете proper cuda error checking и/или запустите свой код с cuda-memcheck, вы обнаружите это.

Исправление может быть довольно простым - изменить ваш смысл этих параметров конфигурации:

dim3 dimBlock(BLOCK_WIDTH,BLOCK_WIDTH,1); 
dim3 dimGrid(numBlocks,numBlocks,1); 

Опять же, я не могу сказать, что это единственная проблема, так как вы не показали полный код, который я мог бы на самом деле тест (который SO expects для подобных вопросов.)

Если вы сделаете выше изменения, и все еще не работает, я хотел бы предложить следующее:

  1. Добавьте правильную проверку ошибок cuda и запустите свой код с cuda-memcheck, как я уже говорил.

  2. Предоставьте complete MCVE, то есть полный код, который кто-то еще может копировать, вставлять и запускать. Также укажите, что выводит cuda-memcheck и проверку ошибок в вашей системе.

Вы должны сделать выше 2 вещи перед вы задаете для отладки помощи здесь на SO.

+0

Благодарим вас за разъяснение. Это помогло. – Lasantos