2012-03-14 2 views
1

Я пишу OpenCL, используя привязки C++, пытаясь создать небольшую библиотеку.OpenCL enqueTask vs enqueNDRangeKernel

NDRange offset(0); 
NDRange global_size(numWorkItems); 
NDRange local_size(1); 

//this call fails with error code -56 
err = queue.enqueueNDRangeKernel(kernelReduction, offset, global_size, local_size); 
//this call works: 
err = queue.enqueueTask(kernelReduction); 

Код ошибки -56 - CL_INVALID_GLOBAL_OFFSET. И я не знаю, почему первый звонок потерпит неудачу. Какие-либо предложения?

+0

Какое измерение вы используете? Согласно документации OpenCL, смещение документации должно быть массивом целочисленных смещений, каждый из которых соответствует определенному размеру, но ваш код не говорит, сколько измерений он использует. – Thomas

+0

Насколько я понимаю с помощью привязок C++, он задается инициализатором NDRange. Если задано 1 целое число, оно будет принимать 1 размер, учитывая 2, это будет предполагаться 2. –

ответ

1

global_work_offset должен быть NULL. Любое значение здесь должно производить CL_INVALID_GLOBAL_OFFSET.

проверить это: clEnqueueNDRangeKernel

+0

Вы смотрите на документацию OpenCL 1.0, в которой глобальные смещения действительно не были реализованы и должны были быть нулевыми. Это не относится к OpenCL 1.1 и 1.2 (где работают глобальные смещения). – Thomas

+1

Вопрос не уточнил версию, так что это мое лучшее предположение. – mfa

2

Если вы используете OpenCL 1.0, вы не можете использовать глобальные сдвиги AFAIK (вы должны работать вокруг, используя постоянный счетчик памяти или что-то). Попробуйте обновить привязки к OpenCL 1.1, если они не будут автоматически адаптироваться и убедитесь, что вы также обновили свои драйверы.

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