Я хотел бы понять, в чем разница, когда я создаю буфер с только для чтения и использую его с __constant
определителем адресного пространства в ядре или использую его с адресным пространством const __global
классификатор.OpenCL: Разница между __константной памятью и константой __global memory
То, что я уже нашел тех, на самом деле не отвечает на мой вопрос, но они содержат полезную информацию:
http://www.khronos.org/message_boards/showthread.php/6466-__constant-vs-const-__global
Is the access performance of __constant memory as same as __global memory on OpenCL
Если я понимаю, что распределение в памяти 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)
Я предполагаю, что это зависит от реализации OpenCL и/или аппаратной архитектуры. –