CUDA - что если я выберу слишком много блоков? - PullRequest
9 голосов
/ 29 марта 2011

Я все еще злюсь на эти матрицы неизвестного размера, которые могут варьироваться от 10 до 20 000 для каждого измерения.

Я смотрю на CUDA SDK и задаюсь вопросом: что, если я выберу слишком много блоков?

Что-то вроде сетки из 9999 x 9999 блоков в измерениях X и Y, если на моем оборудовании есть SM, которые не могут содержать все эти блоки, у ядра будут проблемы или производительность просто рухнет?

Я не знаю, как измерить в блоках / потоках что-то, что может сильно различаться ... Я думаю об использовании МАКСИМАЛЬНОГО числа блоков, которые поддерживает мое оборудование, и затем о том, чтобы потоки внутри них работали по всей матрице, это правильный путь?

Ответы [ 2 ]

13 голосов
/ 29 марта 2011

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

Вы можете указать размеры сетки и блоков во время выполнения.

Изменить: Здесь приведены ограничения на размеры сетки и блоков, из документации.

enter image description here

2 голосов
/ 29 марта 2011

Если вы выбираете слишком большой размер блока, вы теряете несколько циклов, пока «мертвые» блоки удаляются (обычно всего порядка нескольких десятков микросекунд даже для максимального размера сетки на «полноразмерном» ферми или Карта GT200). Это не огромный штраф.

Но размерность сетки всегда должна быть вычисляемой a priori . Обычно существует известная взаимосвязь между количественно измеряемой единицей параллельной работы с данными - что-то вроде одного потока на точку данных или одного блока на столбец матрицы или чего-либо другого - что позволяет вычислять требуемые измерения сетки во время выполнения.

Альтернативной стратегией было бы использование фиксированного количества блоков (обычно требуется всего лишь около 4-8 на MP на GPU) и каждый блок / поток обрабатывал несколько блоков параллельной работы, поэтому каждый блок становится " стойкий». Если при настройке на поток существует много фиксированных накладных расходов, это может быть хорошим способом амортизации этих фиксированных накладных расходов на большее количество работы на поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...