2016-11-05 3 views
-1

общий вопрос: количество потоков должно быть равно размеру элементов, с которыми я хочу иметь дело? exmaple: если у меня есть матрица M [a] [b]. я должен выделять (aXb) потоки, или я могу выделить больше потоков, чем мне нужно (больше, чем ab)? потому что поток, который будет сосредоточен на элементе aXb + 1, вышвырнет нас, не так ли? или решение состоит в том, чтобы поставить условие (только если в диапазоне (ab))?об организации нитей в cuda

конкретный вопрос: пусть будет M [x] [y] матрица с x строками и y столбцами. что 1000 < = x < = 300000 и y < = 100. Как я могу организовать потоки таким образом, чтобы он был общим для каждого входа для x и y. Я хочу, чтобы каждый поток фокусировался на одном элементе в матрице. CC = 2.1 спасибо!

+0

Вы можете выделить больше или вы даже можете выделить меньше. Любой подход может быть выполнен для работы. Если вы выделяете больше потоков, чем необходимо, ваше ядро ​​должно включать условный тест, чтобы убедиться, что каждый поток работает с действительными данными. Если вы выделяете меньше потоков, чем необходимо, ваше ядро ​​должно включать [какой-то цикл] (https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/) для охвата всех элементов данных. –

ответ

1

Общий ответ: Это зависит от проблемы.

В большинстве случаев естественное отображение один к одному задачи к сетке нитей отлично начать, но то, что вы хотите иметь в виду:

  1. Достижение высокой занятости.
  2. Максимальное использование ресурсов графического процессора и пропускной способности памяти.
  3. Работа с достоверными данными.

Иногда для обработки одного элемента может потребоваться использование одной нити для обработки многих элементов или многих потоков. Например, вы можете представить себе ряд независимых операций A, B и C, которые необходимо применять к массиву элементов. Вы можете запускать три разных ядра, но лучше выбрать сетку, чтобы содержать в три раза больше потоков, чем есть элементы, и различать операции по одному из размеров сетки (или что-то еще). С другой стороны, у вас может возникнуть проблема, которая могла бы максимизировать использование общей памяти (например, преобразование изображения) - вы могли бы использовать блок из 16 потоков для обработки окна изображения 5x5, где каждый поток вычислял бы некоторую статистику каждого фрагмента 2x2.

Выбор за вами - лучший совет не всегда идет с очевидным. Попробуйте разные подходы и выберите то, что лучше всего работает.

Смежные вопросы