Анализ масштабируемости на GPU - PullRequest
0 голосов
/ 27 марта 2012

Я пытаюсь провести анализ масштабируемости, используя мой Quadro FX 5800, который имеет 240 ядер в масштабах времени выполнения с количеством ядер, что является классическим исследованием для параллельных вычислений. Мне было интересно, как определение ядра соответствует этому в этом? И как я могу использовать его для запуска на различных настройках ядра, скажем (8,16,32,64,128,240 ядер)? Мой тестовый пример - простое умножение матриц.

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

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

Если вы хотите протестировать масштабирование по ядрам CUDA (бессмысленно) затем вы можете запускать блоки потоков, содержащие 1, 2, 3, ... 32 потока на блок.Запуск не кратных потоков WARP_SIZE (= 32) на блок потоков приведет к использованию только подмножества ядер.В основном это бесполезные слоты выполнения.

Если вы хотите протестировать масштабирование с точки зрения SM, вы можете масштабировать свой алгоритм от 1-го блока до 1000-х блоков потоков.Чтобы понять масштабирование, вы можете искусственно ограничить блоки потоков на SM, настроив разделяемую память на блок потоков при запуске.

Перезапись матрицы умножения для оптимального масштабирования в каждом из этих направлений, вероятно, будет разочаровывающей,Перед тем, как приступить к этому проекту, я бы порекомендовал понять, как распределить простые параллельные вычисления, такие как суммирование от 0 до 100000 или вычисление факториальных масштабов по многопоточным блокам.Эти алгоритмы представляют собой всего несколько строк кода, и вышеупомянутое масштабирование можно попробовать, варьируя конфигурацию запуска (GridDim, BlockDim, SharedMemoryPerBlock) и параметры ядра 1-2. Вы можете рассчитывать время различных запусков, используя профилировщик CUDA, Visual Profiler, Parallel Nsightили CUevents.

1 голос
/ 27 марта 2012

Предполагается, что вы используете CUDA или OpenCL в качестве модели программирования: Один простой способ ограничить использование M количеством мультипроцессоров (SM) - это запустить ваше ядро ​​с конфигурацией выполнения M блоков (потоков),Если каждый SM состоит из N ядер, таким образом вы можете протестировать масштабируемость на N, 2N, 4N, ... ядрах.

Например, если у GPU есть 4 SM, у каждого SM есть 32 ядра.Запустив ядра из 1, 2 и 4 блоков, ваше ядро ​​будет использовать 32, 64 и 128 ядер GPU.

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