Надеюсь, что ответ на мой вопрос не потребует много времени, потому что речь идет о моем понимании этой темы.Совместное выполнение 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. Второй вопрос - я здесь? Или есть лучшее решение, как получить одновременное выполнение?
Было бы очень приятно, если бы вы только сказали, что я прав, или нет, и я был бы очень благодарен, если вы объясните, где я ошибаюсь или предлагаю лучшее решение.
Благодарим вас за это!
Ни модель программирования CUDA, ни аппаратное обеспечение, которое вы используете, не заявляют, что они могут выполнять инструкции, которые вы запрашиваете. Модель программирования и аппаратное обеспечение не были разработаны для достижения вашей цели. Вы не указали, почему вы хотите принудительно выполнить параллельное выполнение. Если это действительно необходимо, лучше всего запустить одно ядро, которое может выполнять всю работу. Даже с одним ядром модель программирования не гарантирует оптимальные запуска. –