2014-10-01 3 views
0

Надеюсь, что ответ на мой вопрос не потребует много времени, потому что речь идет о моем понимании этой темы.Совместное выполнение CUDA

Итак, речь идет о размерах блоков и сеток для выполнения параллельных ядер.

Прежде всего, позвольте мне рассказать о моей карте: это GeForce GTX TITAN, и вот некоторые из ее характеристик, которые, я думаю, важны в этом вопросе.

CUDA Возможность номер Основные/Малая версия: 3.5

Общий объем глобальной памяти: 6144 Мб (6442123264 байт)

(14) Мультипроцессоры, (192) ядер CUDA/MP: 2688 ядер CUDA

размер

Деформация: 32

Максимальное количество нитей на многопроцессорных: 2048

Максимальное число й читает за блок: 1024

Теперь основная проблема: у меня есть ядро ​​(он выполняет разреженное умножение матрицы, но это не так важно), и я хочу запустить его одновременно (!) в нескольких потоках на одном графическом процессоре, вычисление разного умножения матриц. Пожалуйста, обратите внимание на одновременное требование: я хочу, чтобы все ядра запускались в один момент и заканчивались другим (все они!), Поэтому решение, когда эти ядра частично частично перекрываются, не удовлетворяет меня. Также очень важно, чтобы я максимизировал количество параллельных ядер, даже если мы потеряем некоторую производительность из-за этого.

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

В поисках характеристик карты мы видим, что она имеет 14 см и возможность 3.5, что позволяет запускать 32 параллельных ядра. Итак, вывод, который я делаю здесь, заключается в том, что лучшим решением будет запуск 28 параллельных ядер (по два на каждый из 14 SM). Первый вопрос - я здесь?

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

Максимальное количество потоков на многопроцессорных: 2048

Я понимаю это так: если запустить ядро ​​с 1024 нитями и 2-х блоков, эти два блока будут вычисляться одновременно. если мы запустим ядро ​​с 1024 потоками и 4 блоками, тогда две пары блоков будут вычисляться один за другим. Итак, следующий вывод, который я делаю, заключается в том, что запуск 28 ядер с 1024 потоками также будет лучшим решением - потому что это единственный способ, когда они могут выполняться одновременно на каждом SM. Второй вопрос - я здесь? Или есть лучшее решение, как получить одновременное выполнение?

Было бы очень приятно, если бы вы только сказали, что я прав, или нет, и я был бы очень благодарен, если вы объясните, где я ошибаюсь или предлагаю лучшее решение.

Благодарим вас за это!

+1

Ни модель программирования CUDA, ни аппаратное обеспечение, которое вы используете, не заявляют, что они могут выполнять инструкции, которые вы запрашиваете. Модель программирования и аппаратное обеспечение не были разработаны для достижения вашей цели. Вы не указали, почему вы хотите принудительно выполнить параллельное выполнение. Если это действительно необходимо, лучше всего запустить одно ядро, которое может выполнять всю работу. Даже с одним ядром модель программирования не гарантирует оптимальные запуска. –

ответ

1

Существует несколько вопросов о одновременно совпадающих ядрах. Вы можете искать и просматривать некоторые из них.Вы также должны учитывать использование регистров, блоки, потоки и использование разделяемой памяти. Ваш вопрос не отвечает точно, если вы не предоставляете информацию об использовании регистра или использовании общей памяти. Максимизация одновременных ядер - это вопрос , поэтому вы должны изучить это.

Тем не менее, вы хотите наблюдать максимум совпадающих ядер. Как вы уже указали, это 32.

У вас есть 14 SM, каждый из которых может иметь максимум 2048 потоков. 14x2048/32 = 896 потоков на ядро ​​(то есть блоки * потоки на каждый блок)

С размером блока thread 128, равным 7 блокам на ядро. 7 блоков * 32 ядра = всего 224 блока. Когда мы разделим это на 14 SM, мы получим 16 блоков на SM, которые просто совпадают с spec limit.

Таким образом, приведенный выше анализ, 32 ядра, 7 блоков на ядро, 128 потоков на блок, будут в объеме анализа, который может быть выполнен с учетом только данных, которые вы предоставили.

Если это не сработает для вас, я обязательно буду проверять требования к concurrent execution, а затем сосредоточиться на регистрах на поток или разделяемую память, чтобы убедиться, что это ограничители для «занятости» в этом случае ,

Честно говоря, я не очень надеюсь на то, что вы являетесь свидетелем совершенного сценария, который вы описываете, но имеете на это. Мне было бы приятно удивляться. FYI, если бы я пытался сделать что-то вроде этого, я бы, конечно, попробовал это на linux, а не на окнах, особенно учитывая, что ваша карта - это карта GeForce с ограничениями WDDM под окнами.

Ваше понимание кажется ошибочным. Заявления вроде этого:

Если мы запустим ядро ​​с 1024 потоками и двумя блоками, эти два блока будут вычисляться одновременно. если мы запустим ядро ​​с 1024 потоками и 4 блоками, то две пары блоков будут вычисляться один за другим

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