Как «поток» данных из и в глобальную память? - PullRequest
4 голосов
/ 28 июня 2011

Витрина codeproject.com Часть 2. OpenCL ™ - пространство памяти утверждает, что Global memory should be considered as streaming memory [...] и that the best performance will be achieved when streaming contiguous memory addresses or memory access patterns that can exploit the full bandwidth of the memory subsystem.

Мое понимание этого предложения состоит в том, что для оптимальной производительности необходимо постоянно заполнять и считывать глобальную память, пока графический процессор работает над ядрами. Но я понятия не имею, как мне реализовать такую ​​концепцию, и я не могу распознать ее в (довольно простых) примерах и учебных пособиях, которые я прочитал.

Знаете хороший пример или можете ссылаться на него?

Бонусный вопрос: находится ли этот аналог в рамках CUDA?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Я согласен с talonmies относительно его интерпретации этой рекомендации: последовательный доступ к памяти самый быстрый. Совершенно очевидно (для любого разработчика, поддерживающего OpenCL), что последовательный доступ к памяти является самым быстрым, хотя забавно, что NVidia в явном виде объясняет это так.

Ваша интерпретация, хотя и не та, что говорится в этом документе, также верна. Если ваш алгоритм это позволяет, лучше всего загружать куски разумного размера асинхронно, чтобы он мог быстрее начать вычисления, перекрывая вычисления с передачами DMA в / из системной памяти.

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

2 голосов
/ 28 июня 2011

Мое понимание этого предложения состоит в том, что для оптимальной производительности необходимо постоянно заполнять и читать глобальную память, пока графический процессор работает над ядрами

Это не совсем правильная интерпретация.

Типичные устройства OpenCL (например, графические процессоры) имеют чрезвычайно широкополосные системы глобальной памяти с высокой задержкой.Система памяти такого типа высоко оптимизирована для доступа к непрерывному или линейному доступу к памяти.То, что вы цитируете, на самом деле говорит о том, что ядра OpenCL должны быть спроектированы так, чтобы получать доступ к глобальной памяти в виде смежного способа, который является оптимальным для памяти GPU.NVIDIA называет этот вид оптимального непрерывного доступа к памяти «объединенным» и обсуждает оптимизацию шаблонов доступа к памяти для своего оборудования с некоторыми подробностями в своих руководствах по CUDA и OpenCL.

...