Используйте глобальную память для (большой) локальной / частной температуры.структура данных эффективно в OpenCL - PullRequest
4 голосов
/ 08 сентября 2011

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

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

Итак, я спрашиваю себя сейчас, если устройство "знает "что я не читаю данные, записанные другой рабочей группой / элементом, можно ли ускорить доступ к памяти?"Что именно влияет __constant с точки зрения механизма доступа к памяти?Могу ли я неправильно использовать это или подобное ключевое слово?Или даже есть ключевое слово / метод для моей проблемы, которую я пропустил?

Другое дело: память для этой структуры данных должна быть выделена только в памяти устройства;Мне не нужно получать доступ (даже не инициализировать) его на хосте.Есть ли более эффективный способ сделать это, чем отправить неинициализированный массив на устройство?Я использую QtOpenCL, который позволяет мне передавать инициализированный хостом вектор примитивов, который конвертируется (host-) внутри в буфер и отправляется на устройство при вызове ядра.Поэтому я ищу QtOpenCL-способ сделать это.AFAIK, только локальная память может быть выделена изнутри ядра.(Я получаю ошибки при определении массива как __global.)

Заранее спасибо!

1 Ответ

0 голосов
/ 08 сентября 2011

Поскольку постоянный размер буфера обычно довольно мал (например, 64 КБ на моем GTX 580, и этот размер распределяется между всеми рабочими группами, аналогично локальной памяти 48 КБ), я думаю, что использование постоянного буфера не будет решением,Я бы посоветовал взглянуть на изображения - в примерах оптимизации они часто используются - они кэшируются для пространственной локации 2D, доступ не нужно объединять.

Кстати, я где-то видел, что отключение кэша L1 с помощьюнекоторые опции компилятора на NVidia могут привести к несколько лучшей производительности при частом произвольном доступе к глобальной памяти.

По второму вопросу: я думаю, что если вы не передадите какой-либо из CL_MEM_USE_HOST_PTR, CL_MEM_ALLOC_HOST_PTR илиCL_MEM_COPY_HOST_PTR отмечает, что память на хосте не выделена, и, следовательно, на устройство ничего нельзя скопировать.

...