WedX - журнал о программировании и компьютерных науках

создание матрицы Редхеффера с использованием 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;
    }
}

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

17.02.2016

Ответы:


1

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

#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);

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

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

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

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

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

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

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

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

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

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

17.02.2016
  • Спасибо за объяснение. Это помогло. 23.02.2016
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]