Подтвердить что ты не робот

Частная память медленнее локальной памяти?

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

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

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

4b9b3361

Ответ 1

Ответ Ashwin находится в правильном направлении, но немного вводит в заблуждение.

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

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

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

Ответ 2

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

Ответ 3

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

В соответствии с "Heterogeneous Computing with OpenCL" (пересмотренная версия OpenCL 1.2):

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

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

Ответ 4

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

В зависимости от реализации, это может быть быстрее или медленнее, потому что 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

введите описание изображения здесь

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

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

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

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