#gpu #multi-gpu
#графический процессор #multi-gpu
Вопрос:
Я использовал MPI CUDA для этой реализации вычислений на нескольких графических процессорах. Используемый кластер графических процессоров имеет 12 узлов, каждый из которых имеет 6 графических процессоров K40. Когда я использую 6 графических процессоров, они относятся к одному и тому же вычислительному узлу. Однако, если я измеряю время выполнения, изменяя количество графических процессоров, я почти не получаю ускорения при использовании 4 графических процессоров вместо 2 или 6 вместо 2. Ниже приведен график времени выполнения с количеством графических процессоров на двух разных входных размерах. Как ни странно, приложение достигает ускорения при дальнейшем увеличении количества графических процессоров в системе. Однако начальная плоская часть необъяснима.
Я также измерил время связи через nvprof. При добавлении графических процессоров количество вызовов cudaMemcpy увеличивается, как и ожидалось. Однако, как ни странно, среднее время завершения вызовов cudaMemcpy уменьшается с увеличением количества графических процессоров. Этого не должно произойти, поскольку размер каждой передачи данных остается неизменным, увеличивается только количество передач данных.
Итак, в основном возникают два вопроса: 1) Есть ли у кого-нибудь какое-либо возможное объяснение начальной плоской части графика? 2) Как уменьшается время cudaMemcpy при добавлении большего количества графических процессоров в систему?
Любая помощь будет высоко оценена.
Комментарии:
1. Использует ли ваша система SIMD ? Это объясняет, почему среднее время копирования памяти уменьшается.
2. Я предполагаю, что начальная плоская часть означает, что ваша реализация не масштабируется на одном узле (используя несколько графических процессоров одного и того же узла), но она масштабируется при передаче сообщений благодаря MPI. О том, почему он не масштабируется на одном узле, вы, вероятно, слишком сильно подчеркиваете какой-то общий ресурс (например, переключатель PCIe, который вы используете для отправки данных с хоста на графические процессоры). Я понятия не имею о второй части вашего вопроса.
3. Спасибо Эмильену за комментарий. Я решил проблему. На самом деле график был неправильным. После каждого запуска ядра у меня был вызов cudaDeviceSynchronize() для проверки ошибок, что заставляло процессор ждать запуска ядра на следующем графическом процессоре, пока предыдущий графический процессор не завершит выполнение. И, таким образом, несмотря на то, что вычисления выполнялись несколькими графическими процессорами, они не выполнялись параллельно. Когда программа запускает два процесса MPI, она фактически ведет себя как реализация с 2 графическими процессорами, а не с 12. Точный график этой ошибки будет выглядеть как функция обратного шага.
4. Да, Остин, система SIMD. Как это объясняет поведение времени memcpy? Я все еще не понимаю.
5. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что он был основан на ошибке программирования, а содержащиеся в нем данные и гипотезы неверны. Здесь нет ответа на вопрос.