我最近开始将 OpenCL 整合到我的 OpenGL 应用程序中,该应用程序呈现一个基本的粒子系统,两者之间的基本互操作(没有事件)工作正常。但是,在尝试使用 clCreateEventFromGLsyncKHR
函数来提高性能而不必调用 glFinish
和 clFinish
后,我无法获得运行程序,因为程序提示以下错误:
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
更新如果我使用支持 cl_khr_gl_event 扩展的设备,上面的代码仍然不起作用
您的设备不支持 cl_khr_gl_event
扩展。需要该扩展才能使用 clCreateEventFromGLsyncKHR
方法。如前所述 here .通常,作为扩展结束/开始的一部分的所有方法的名称中都有 KHR/NV/AMD。
您的代码的另一个问题是您还没有启用扩展,您必须通过定义以下内容来完成:
#include <CL/cl_gl_ext.h>
我是一名优秀的程序员,十分优秀!