Большой постоянный массив в глобальной памяти - PullRequest
0 голосов
/ 14 августа 2011

Возможно ли повысить производительность, запустив графический процессор для алгоритма со следующими свойствами:

  1. Существуют сотни и даже тысячи независимых потоков, которые не требуют синхронизации во время вычислений
  2. Каждый поток имеет относительно небольшую (менее 200 КБ) область локальной памяти, содержащую данные, специфичные для потока. Чтение / запись
  3. Каждый поток обращается к большому блоку памяти (сотни мегабайт и даже гигабайт). Эта память доступна только для чтения
  4. Для каждого доступа к глобальной памяти будет как минимум два доступа к локальной памяти
  5. В алгоритме будет много веток

К сожалению, алгоритм довольно сложен для показа здесь.

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Прежде чем я начну, пожалуйста, помните, что в CUDA есть два уровня параллелизма: блоки и потоки.

Существуют сотни и даже тысячи независимых потоков, которые не требуют никакой синхронизации во время вычислений

Поскольку вы можете запускать до 65535 блоков на измерение, вы можете рассматривать каждый блок в cuda как эквивалент "вашего" потока.

Каждый потокимеет относительно небольшую (менее 200 КБ) область локальной памяти, содержащую специфичные для потока данные.Чтение / запись

К сожалению, большинство карт имеют ограничение общей памяти 16 КБ на блок.Так что, если вы можете понять, как справиться с этим нижним пределом, отлично.Если нет, вам нужно использовать глобальный доступ к памяти.

Каждый поток обращается к большому блоку памяти (сотни мегабайт и даже гигабайт).Эта память доступна только для чтения

Нельзя связывать такие большие массивы с текстурами или постоянной памятью.Таким образом, в данном блоке попытайтесь заставить потоки читать непрерывные порции данных для лучшей производительности.

Для каждого доступа к глобальной памяти будет как минимум два доступа к локальной памяти.быть много веток в алгоритме

Поскольку вы по сути заменяете один поток в своей первоначальной реализации блоком в cuda, вы можете немного пересмотреть код, чтобы попытаться реализоватьПараллельная версия "на код потока" тоже.

На первый взгляд, это может быть непонятно, но немного подумайте.Любой алгоритм, имеющий сотни / тысячи независимых частей без синхронизации, отлично подходит для параллельной реализации, даже с cuda.

1 голос
/ 14 августа 2011

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

Записи, которые вам могут понадобиться, чтобы добавить некоторые отступы и т. Д., Чтобы избежать конфликтов в банках.

Использование сотен мегабайт или гиговданные несколько касаются.Вы можете вырезать это как-нибудь?Надеюсь, у вас есть большой навороченный Tesla / Quadro с большим количеством оперативной памяти.

Тем не менее, название игры для оптимизации CUDA всегда означает эксперимент, профиль / измерение, промывание и повторение.

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