Welcome, Guest
Username: Password: Remember me
Добро пожаловать на форум о CUDA!

Если у Вас проблема с конкретной программой, использующей CUDA, пожалуйста, включите в сообщение её код. Используйте
разметку
для оформления кода.

TOPIC: Распараллеливание вложенных циклов

Распараллеливание вложенных циклов 5 years 1 month ago #20

  • Анатолий Жирнов
  • Анатолий Жирнов's Avatar
Здравствуйте!

Недавно случайно нашел Ваши курсы в сети Интернет. Они достаточно хорошо освящают основные аспекты этой новой технологии. Я прослушал Ваши лекции и прочитал 3 книги по данной технологии (www.nvidia.ru/object/cuda-parallel-computing-books-ru.html). Но у меня есть вопрос. Возможно ли полностью или хотя бы частично распараллелить на данной технологии код, в котором 3 цикла вложенных, а в них ещё 2 цикла которые вычисляют интеграл, т.е. итого 5 циклов?. В литературе нету ничего про распараллеливание вложенных циклов.
The administrator has disabled public write access.

Распараллеливание вложенных циклов 5 years 1 month ago #21

  • dmikushin
  • dmikushin's Avatar
  • OFFLINE
  • Administrator
  • Posts: 9
  • Thank you received: 1
  • Karma: 3
Здравствуйте, Анатолий,

Согласен с Вами, этот вопрос стоит обсудить в лекциях. Безотносительно CUDA, Вы всегда можете составить правило отображения из N-мерного пространства индексов в M-мерное, верно? Например, если N=3, а M=1, то отображение будет иметь вид линеаризации:
m_1 := n_3 * N_2 * N_1 + n_2 * N_1 + n_1

Теперь представим, что N - это пространство индексов Вашей задачи, а M - это пространство CUDA Compute Grid (которое, как Вы знаете, может быть 1-мерным, 2-мерным или 3-мерным). Таким образом, распараллеливание задачи на GPU по сути заключается в нахождении такой формулы-отображения. Вариантов тут много. В частности, можно отобразить несколько размерностей на одну (что будет аналогично тому, что делает OpenMP collapse на CPU), тогда у Вас не будет вложенных циклов. Или же, можно сделать так, чтобы часть циклов вращалось уже в каждой нити - видимо такой вариант подразумевает Ваш вопрос. В этом случае эти циклы будут исполняться последовательно, и проблемы в этом нет, если диапазоны верхних 1-3 циклов CUDA compute grid достаточно велики чтобы покрыть вычислительные ресурсы GPU. Если в циклах внутри нити читаются данные из глобальной памяти, то необходимо следить чтобы был coalescing.

Резюмируя, распараллеливание вложенных циклов - это не возможность технологии, а возможность пользователя написать индексную математику. Технология здесь может только облегчить эадачу, как это делают OpenACC или OpenMP. Кажется, OpenCL позволяет назначить на compute grid больше 3 циклов, по-моему сколько угодно вообще. К сожалению, все эти возможности упираются в то, насколько хорошо они реализованы. Так что сделать руками формулу - самый беспроигрышный вариант! :)
The administrator has disabled public write access.
Time to create page: 0.057 seconds