2016-04-30 2 views
0

Я пишу программу для школы, использующую общую память. Я получил функцию для правильной работы, но она работает только с блоками на размер сетки: 1. Если на каждую сетку больше 1 блока, то функция больше не работает.CUDA общая память более 1 блок перестает работать

Например, если я отправляю массив размером 10, с 1 блоком и 10 потоками, эта функция работает правильно. Если я отправлю в тот же массив с 2 блоками и 5 потоками на блок, то он больше не работает. Когда я говорю, что больше не работает, я получаю тот же массив, в который я отправил, назад, как будто ничего не происходит.

Для жизни меня не могу понять, почему. Есть ли специальный способ использования разделяемой памяти по нескольким блокам?

Просто, чтобы попробовать и отладить это, я заменил весь код a[threadId] = threadId, и массив был, по-видимому, правильным (печать чисел от 0 до 9). Поэтому я не понимаю, почему это не сработает, если threadId кажется правильным, и он работает с 1 блоком.

ответ

2

Существует проблема здесь:

int threadId = threadIdx.x + blockDim.x * blockIdx.x; 
b[threadId] = ...; 

Вашего threadId переменным является глобально уникальным индексом резьбы. Это означает, что чем больше потоков вы включите в сетку (например, через большее количество блоков), тем выше будет этот показатель.

Но для общей памяти индекс в каждом блоке начинается с нуля. Поэтому в итоге, когда вы добавите больше блоков, ваша переменная threadId будет больше, чем объем разделяемой памяти в блоке.

Обычное решение сделать что-то вроде этого:

b[threadIdx.x] = ...; 

поскольку threadIdx.x переменной начинается с нуля в каждом блоке. (Вы бы заменить все возникновение b[threadId] с b[threadIdx.x], используя эту стратегию, а не только один вхождений.)

Там могут быть и другие проблемы в вашем коде. Поскольку вы не указали полный код, невозможно диагностировать других.

И на основе утверждений, как это:

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

Мое предположение вы не делаете proper cuda error checking. Вы действительно должны делать это до с просьбой о помощи от других. Даже если вы не понимаете выход ошибки, это поможет другим, кто пытается вам помочь.