2013-08-01 3 views
4

Я хотел бы понять, в чем разница, когда я создаю буфер с только для чтения и использую его с __constant определителем адресного пространства в ядре или использую его с адресным пространством const __global классификатор.OpenCL: Разница между __константной памятью и константой __global memory

То, что я уже нашел тех, на самом деле не отвечает на мой вопрос, но они содержат полезную информацию:

Если я понимаю, что распределение в памяти GPU происходит при вызове функции clCreateBuffer. Поэтому я не понимаю, как компилятор решает, что буфер находится в постоянной памяти (которая имеет ограничение на 64 КБ) или в глобальной памяти. (Я знаю, что в большинстве случаев постоянная память является частью глобального пространства памяти.) Если это зависит от определителя адреса, это означает, что ограничение на 64 КБ можно игнорировать с помощью const __global.

Есть ли разница в производительности между __constant и const __global? Память __global может быть кэширована, поэтому оба они доступны только для чтения и (могут быть) кэшированы. (Источник: 3.3. Модель памяти/раздел глобальной памяти и рисунок 3.3; http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf#page=24)

+0

Я предполагаю, что это зависит от реализации OpenCL и/или аппаратной архитектуры. –

ответ

1

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

Например, на графической карте nvidia, помеченной символом __constant, кешируется (размер кеша составляет 8 КБ на каждый процессор, который я считаю для всех текущих устройств). Следует отметить, что доступ к этому кэшу осуществляется сериализованными, если разные рабочие элементы получают доступ к различным адресам, и поэтому я нашел его наиболее полезным для передачи структур параметров, которые являются постоянными в рабочей группе. Если вы посмотрите раздел о постоянной памяти в руководстве по программированию CUDA, вы получите представление о том, как это работает. Память, отмеченная как const __global, не кэшируется. Я полагаю, она просто сообщает компилятору, чтобы выдать ошибку, если вы попытаетесь изменить значение, указанное на значения.

Я не уверен, является ли AMD сделать подобный вид кэширования на своих аппаратных

Надежда, что помогает

+0

Возможно, размер кеша равен 64 КБ? Я думаю, что все пространство памяти __constant составляет 64 КБ. (См. CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE) –

+0

Вы действительно правы, я ошибся. Хотя общий размер составляет 64 КБ, кеш составляет 8 Кбайт на мультипроцессор.Я обновил свой ответ, чтобы исправить это. – mcd40

0

Для реализации от AMD OpenCL см объяснение здесь: https://github.com/RadeonOpenCompute/ROCm/issues/203

В основном, константа имеет значение неявного ограничивает. Таким образом, константа int * p в основном эквивалентна const global int * ограничивает p.

Смежные вопросы