Вы написали, что «размещение графика в глобальной памяти, по-видимому, исключено из соображений скорости».- ну, у вас нет много других вариантов.Я имею в виду, что данные в общем случае находятся в глобальной памяти.
(Примечание: в некоторых случаях вы можете преобразовать их в текстуры (если формат элемента подходит). Также так называемая «постоянная» памятьна nvidia оптимизирован для операций типа «широковещательный», что означает, что все потоки читаются из одного места, что, я думаю, не так. Я бы посоветовал держаться подальше от этих типов в начале.)
Хорошо,в качестве совета, сначала попробуйте просто использовать «глобальную память».Время жизни локальной памяти - только во время выполнения ядра.Это оправдано только в том случае, если вы повторно используете один и тот же элемент данных более одного раза (представьте, что это кэш-память, в которую вы явно загружаете предварительно).
Кроме того, локальная память ограничена примерно 16-48 КБ, поэтому она можетхранить только часть ваших данных.Попробуйте разбить ваш граф на подграфы, которые вписываются в эти блоки.
В вашем представлении вы можете разбить ребра (от [] до []) на группы фиксированного размера.
универсальныйшаблон
шаг 1. копирование из глобального в локальное
your_local_array [get_local_id (0)] = input_global_mem [get_global_id (0)]
шаг 2. убедитесь, что каждый потоктеперь выполняет операционный барьер (локальный забор)
, теперь рабочие элементы (потоки) могут работать с подграфом, загруженным в локальную память.
Помните, локальная память будет содержать только ограниченную часть всего графа.если вам нужен доступ к произвольным узлам из каких-либо потоков, приведенный выше шаблон не будет использоваться.
Я предлагаю для начала провести эксперименты с алгоритмом без использования локальной памяти (считывание непосредственно из глобальной памяти) и убедиться, что он работаетправильно (обычно на дороге есть какие-то сюрпризы).Позже вы сможете определить, какие части данных вы можете хранить в локальной памяти, чтобы ускорить его.