2013-11-19 3 views
1

Недавно я начал включать OpenCL в мое приложение OpenGL, которое отображает базовую систему частиц, основное взаимодействие - без событий - между двумя работами отлично. Однако, попробовав использовать функцию clCreateEventFromGLsyncKHR для того, чтобы улучшить производительность, вместо того, чтобы позвонить glFinish и clFinish, я не могу получить выполняемую программу, как программа жалуется следующее сообщение об ошибке:Ошибка связи при использовании функции расширения clCreateEventFromGLsyncKHR

error LNK2019: unresolved external symbol _clCreateEventFromGLsyncKHR 

Я попытался использовать обе предоставленные функции, используемые для получения указателей функции расширения (clGetExtensionFunctionAddressForPlatform, clGetExtensionFunctionAddress), но по причинам, которые я не могу понять, я не могу заставить его работать.

Пример кода:

#include <CL/cl_gl_ext.h> 

typedef cl_event (*PFNCLCREATEEVENTFROMGLSYNCKHR) (cl_context context, cl_GLsync sync, cl_int *errcode_ret); 

PFNCLCREATEEVENTFROMGLSYNCKHR clCreateEventFromGLsyncKHR = (PFNCLCREATEEVENTFROMGLSYNCKHR)clGetExtensionFunctionAddressForPlatform(opencl::target::inst()->platform(), "clCreateEventFromGLsyncKHR"); 

GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); 

cl_event gl_event = clCreateEventFromGLsyncKHR(opencl::contexts["GL_CL_context"]->_get(), sync, NULL); 

ли кто-нибудь любезно помочь мне в понимании того, где это я неправильно?

Для тех, кто заинтересован:

Name:      GeForce GT 740M 
Vendor:     NVIDIA Corporation 
Device OpenCL C version:    OpenCL C 1.1 
Driver version:    327.23 
Profile:      FULL_PROFILE 
Version:      OpenCL 1.1 CUDA 
Extensions:     cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_d3d9_sharing cl_nv_d3d10_sharing cl_khr_d3d10_sharing cl_nv_d3d11_sharing cl_nv_compiler_options 
cl_nv_device_attribute_query cl_nv_pragma_unroll cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics 
cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_fp64 

Update Приведенный выше код еще не работает, если я использую устройство, которое поддерживает расширение cl_khr_gl_event

+0

Что произойдет, если изменить имя вашей переменной 'clCreateEventFromGLsyncKHR' к что-то другое? Является ли это переменной или чем-то еще, что вызывает ошибку, является то, что я пытаюсь выяснить ... –

+0

Я получаю ошибку, связанную с неопределенным значением – user1087765

+0

... когда я пытаюсь выполнить вызов функции – user1087765

ответ

0

Ваше устройство не поддерживает cl_khr_gl_event расширение. Это расширение необходимо для использования метода clCreateEventFromGLsyncKHR. Как указано here. Как правило, все методы, входящие в конец/начало расширения, имеют KHR/NV/AMD от их имени.

Еще одна проблема с вашим кодом, в том, что вы не включили расширение в любом случае, с вами должны сделать, определив следующее:

#include <CL/cl_gl_ext.h> 
+0

Аполлогии, которые который не был включен в примерный код, но находится в самом коде. Интересный момент. У меня есть два графических процессора без расширения, как вы выделили, и другое, что делает. Однако то же самое происходит, если я использую устройство с расширением. Могла ли моя проблема теперь в том, как написанный выше код был написан? – user1087765

+0

Возможно, у библиотеки, которую вы связываете, нет метода. Вы связываетесь с nVIDIA? У вас есть другая библиотека для связи? – DarkZeros

+0

После беспорядка с ним (с использованием того же кода) он теперь дает мне следующую ошибку: Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено в вызове функции. Обычно это результат вызова функции, объявленной с одним вызовом, с указателем функции, объявленным с другим соглашением о вызовах. – user1087765