Частная память медленнее, чем локальная? - PullRequest
13 голосов
/ 27 марта 2012

Я работал над ядром, у которого было много общего доступа к памяти для каждого потока, поэтому я скопировал их в локальную память, что дало скорость до 40%.

Я хотел еще больше ускорения, поэтому скопировал из локальной вprivate, что ухудшило производительность

Так правильно ли, что я считаю, что мы не должны использовать слишком много личной памяти, которая может ухудшить производительность?

Ответы [ 4 ]

15 голосов
/ 06 ноября 2012

Ответ Эшвина в правильном направлении, но немного вводит в заблуждение.

OpenCL абстрагирует адресное пространство переменных от их физического хранилища, и между ними необязательно отображается соотношение 1: 1.

Рассмотрим переменные OpenCL, объявленные в адресном пространстве __private, которое по умолчанию включает в себя автоматические переменные без указателя внутри функций.Реализация графического процессора NVidia будет физически распределять их в регистрах, насколько это возможно, и перетекать в физическую память вне кристалла только при недостаточной емкости регистра.Эта конкретная внешняя память называется «локальной CUDA-памятью» и имеет характеристики производительности, сходные с памятью, выделенной для глобальных переменных, что объясняет снижение производительности из-за переполнения регистра.В этой реализации не существует такой физической вещи, как «частная память», только «частное адресное пространство», которое может быть выделено как внутри кристалла, так и вне его.

Падение производительности не является прямым следствием использованияличное адресное пространство (или «личная память»), которое обычно выделяется в высокопроизводительной памяти.Это связано с тем, что в этой реализации переменная была слишком велика для размещения в высокопроизводительных регистрах и поэтому «перетекла» в память вне кристалла.

1 голос
/ 12 января 2017

(я знаю, что это старый вопрос, но приведенные ответы не очень точны, и я видел противоречивые ответы в других местах во время поисков в Google.)

Согласно "Гетерогенным вычислениям с OpenCL" (пересмотренный OpenCL)Версия 1.2):

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

Итак, если вы используетемного частной памяти или использовать массивы в частной памяти, да, это может быть медленнее, чем в локальной памяти.

0 голосов
/ 08 февраля 2017

Ответ Джеймса Билби - верное направление, но оно немного не в пути:

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

Частная память в реализации AMD, самая быстрая (наименьшая задержка, самая высокая пропускная способность, например, 22 ТБ / с)для основного потока GPU).

Здесь, в приложении -D:

http://developer.amd.com/wordpress/media/2013/07/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide-rev-2.7.pdf

enter image description here

вы можетесм. регистр файл, LDS , константный кэш и global , которые используются для различных пространств имен, когда для них достаточно места.Например, регистровый файл имеет 22 ТБ / с и только около 300 КБ на вычислительную единицу.Это имеет меньшую задержку и большую пропускную способность, чем LDS, который используется для __local памяти.Общий размер LDS даже меньше, чем это (на вычислительную единицу).

Если переход от локального к частному не приносит пользы, вам следует уменьшить размер группы локальных потоков, например, с 256 до 64.Так что больше приватных регистров доступно для каждого потока.

Так что для этого примера AMD GPU, локальная память в 15 раз быстрее, чем глобальная память, частная память в 5 раз быстрее, чем локальная память.Если он не помещается в личную память, он перетекает в глобальную память, поэтому здесь может помочь только кэш L1-L2.Если данные многократно не используются, нет смысла использовать здесь частные регистры.Просто передавайте данные из глобального в глобальное, если их используете только один раз.

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

0 голосов
/ 27 марта 2012

In (GPU-подобные) устройства OpenCL, локальная память находится на кристалле и близка к элементам обработки (PE).Это может быть так же быстро, как доступ к кэш-памяти L1. личная память для каждого потока фактически распределяется из внешней памяти вне кристалла.Это далеко от PE и может иметь задержку в сотни тактов, что снижает производительность чтения-записи.

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