Использование квалификатора __constant в ядрах OpenCL

У меня проблемы с использованием квалификатора __constant в моих ядрах OpenCL. Моя платформа - Snow Leopard.

Я попытался инициализировать объект памяти CL только для чтения на графическом процессоре, скопировав в него свой постоянный массив с хоста. Затем я устанавливаю аргумент ядра так же, как с аргументами памяти __global, но это не работает должным образом, но я не вижу ошибок или предупреждений. Я также пробовал использовать данные непосредственно в функции clSetKernelArg, как и в случае с типами float и int, ни то, ни другое не работает.

Я делаю ошибки или что-то не так с реализацией Apple? Я хотел бы увидеть какие-либо рабочие примеры, как это делается, как OpenCL (gpu), так и код хоста.


person leinz    schedule 16.10.2009    source источник


Ответы (3)


Я сомневаюсь, что с реализацией Apple есть что-то настолько фундаментальное. Я использовал следующее приложение OpenCL Hello World Example, чтобы получить ознакомьтесь с основами.

В этом примере я заменил __global float* input на __constant float* input, и он работал нормально. Вам также необходимо убедиться, что ваш буфер равен CL_MEM_READ_ONLY, используя что-то вроде clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL).

Читая спецификацию, я думаю, что __constant => __global + CL_MEM_READ_ONLY.

Я использую Snow Leopard на MBP 15 ".

person alexr    schedule 22.10.2009

Есть некоторые ошибки в том, как компилятор Apple OpenCL обрабатывает __constant переменные на GPU. Если в журнале компилятора написано что-то вроде

OpenCL Build Error : Compiler build log:
Error while compiling the ptx module: CLH_ERROR_NO_BINARY_FOR_GPU
PTX Info log: 
PTX Error log: 

тогда у меня была такая же ошибка, как и у вас, и я сообщил об этом. Люди в Apple отметили его как дубликат (по-видимому, rdar: // 7217974), поэтому я предполагаю, что это известная проблема, и они работают над ней.

person ianh    schedule 28.10.2009

«Читая спецификацию, я думаю, __constant => __global + CL_MEM_READ_ONLY.»

Не совсем так, когда вы указываете _constant вместо __global, вы говорите своему устройству сохранять эти данные в другой части памяти. В некоторых устройствах это правда, что может быть то же самое, а в других - нет. Например, на картах NVIDIA у вас есть только 64 КБ _constant памяти и множество МБ для __global. Преимущество __constants в том, что в устройствах NVIDIA он кешируется :)

Вы можете запросить свое устройство: (пример моего запроса устройства)

CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 МБ

CL_DEVICE_GLOBAL_MEM_SIZE: 255 МБ

CL_DEVICE_LOCAL_MEM_SIZE: 16 КБайт

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 КБайт

person Vando    schedule 21.05.2010
comment
__constant или постоянное имя адресного пространства используется для описания переменных, выделенных в глобальной памяти и к которым осуществляется доступ внутри ядра (ядер) как переменные только для чтения. Они из OpenCL Spec. Я думаю, что постоянная память в OpenCL отличается от CUDA. Я имею в виду, что доступ к __constant не быстрее, чем к __global. - person Samuel; 28.08.2012