Ошибка избыточного предоставления потоков для CUDA C++.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка избыточного предоставления потоков для CUDA C++.

Сообщение Anonymous »

Код: Выделить всё

__global__ void kernel(x, y, z)
{
if (j > 0 && i > 0 && j < nj-1 && i < ni-1) {
...
}
}

int main()
{
// Specify our 2D dimensions
const int ni = 200;
const int nj = 100;

const int size = ni * nj * sizeof(float);

// this is correct answer
dim3 threads_per_block(32, 16, 1);
dim3 number_of_blocks((nj/tblocks.x)+1, (ni/tblocks.y)+1, 1);

return 0;
}

В этом коде размер данных составляет 100 x 200. Первоначально я использовал следующее

Код: Выделить всё

dim3 threads_per_block(16, 16, 1);
dim3 number_of_blocks(16, 16, 1);
У меня было бы 256 x 256 = 65 536 потоков, что намного больше, чем необходимое количество потоков для покрытия домена 200 x 100 (20 000 потоков). Поэтому я думаю, что размер сетки достаточно велик, чтобы покрыть данные. Но я всегда получаю неправильные результаты. Как только я сделаю размер сетки всего на один блок больше размера данных, все будет работать отлично. Может ли кто-нибудь объяснить мне, почему?
Я подумал, что мне не нужно слишком много думать о том, как настроить сетку, если она больше, чем данные, и я могу использовать оператор if для выбора диапазон потоков, которые я хочу использовать для вычислений. Но, видимо, это не так.

Подробнее здесь: https://stackoverflow.com/questions/789 ... for-cuda-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»