Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DirectX 9设置OpenCL_Directx_Opencl - Fatal编程技术网

使用DirectX 9设置OpenCL

使用DirectX 9设置OpenCL,directx,opencl,Directx,Opencl,我对OpenCL和GPU编程完全陌生。现在我正在做一个项目,我试图看到在游戏中使用GPU可以节省性能。然而,有了这一点,我遇到了一个障碍;如何设置Directx项目以与OpenCL代码库对话 我已经在谷歌上搜索了大约一个星期,没有找到任何东西。如果有人能给我指出正确的方向,我会非常感激。OpenCL与DirectX没有任何关系,它只是另一个库 对于OpenCL,您需要一个实现(“SDK”),因为Khronos不提供这些实现(它们只提供规范)。 Intel、AMD和Nvidia都提供了一个,但它们

我对OpenCL和GPU编程完全陌生。现在我正在做一个项目,我试图看到在游戏中使用GPU可以节省性能。然而,有了这一点,我遇到了一个障碍;如何设置Directx项目以与OpenCL代码库对话


我已经在谷歌上搜索了大约一个星期,没有找到任何东西。如果有人能给我指出正确的方向,我会非常感激。

OpenCL与DirectX没有任何关系,它只是另一个库

对于OpenCL,您需要一个实现(“SDK”),因为Khronos不提供这些实现(它们只提供规范)。 Intel、AMD和Nvidia都提供了一个,但它们有不同的要求和限制

安装其中一个之后,您将拥有必要的头文件和库,可以根据OpenCLAPI编码并链接到OpenCL.dll


SDK或在线上有很多示例源,您必须编写内核,其余大部分是初始化和内核编译的样板代码。

允许将OpenCL缓冲区作为纹理共享,反之亦然的特定OpenCL扩展是cl_khr_d3d10_sharing.txt

OpenCL具有用于在DirectX和OpenCL(以及OpenGL和OpenCL)之间共享内存的扩展。这允许您读取或写入DirectX缓冲区,包括OpenCL中的纹理。Ani的回答提到了DirectX 10的扩展,但是因为问题是关于DirectX 9的,所以您实际使用的扩展是

此扩展只有4个功能:

此函数允许您获取可与给定Direct3D 9设备共享内存的OpenCL设备的OpenCL设备ID

此函数用于获取给定Direct3D 9内存对象的OpenCL
cl_mem
内存对象

此函数锁定指定的共享内存对象,以便您可以从OpenCL读取和/或写入该对象

此函数用于从OpenCL解锁指定的内存对象,以便Direct3D可以再次读取/写入它


一旦您使用了上述函数来共享和同步对内存缓冲区的访问,Direct3D 9端和OpenCL端的所有其他功能都将与这些特定API的其他功能一样工作

请注意,您的GPU需要支持cl_khr_dx9_媒体共享扩展才能正常工作。您可以检查OpenCL平台和设备的extensions属性,以确认支持此扩展


一些NVidia GPU支持另一个扩展名为。其工作原理与cl_khr_dx9_media_共享扩展相同,但具体细节略有不同。最大的区别在于,它有不同的函数来获取不同类型Direct3D 9缓冲区的
cl_mem
对象,而不是一个函数来覆盖所有这些缓冲区。

您可能还没有找到答案,因为“如何设置Directx项目以与OpenCL代码库对话?”实际上没有多大意义。DirectX和OpenCL都是不同的API。你到底想做什么?我想让我的项目利用GPU来提高性能。为了访问GPU,我将使用OpenCL作为语言。我的问题是;如何让我的C++/DirectX代码接受新的OpenCL API代码?我找不到任何东西可以像使用DirectX程序一样设置项目。比如我需要链接什么?等等,DirectX也利用了GPU(至少通过Direct3D),因此加入OpenCL对图形没有任何好处(如果游戏是图形化的,那么在GPU上做更多的工作可能不是最好的主意!)。DirectCompute(我想你说的是什么?)是DirectX 10及以上的IIRC。这并不是在它上面投入更多的工作,而是让它更聪明地完成同样的任务,希望能提高性能。感谢您对其余评论的帮助性回复。@N0Xus我认为您不理解什么是OpenCL或DirectX。两者都是允许直接访问GPU的API。DirectX专门用于图形和其他多媒体操作,因此对于大多数图形相关操作,它实际上比OpenCL更快。OpenCL只允许访问GPU进行更通用的编程。考虑到这一点,你的问题是“我如何得到我的C++/DirectX代码来接受新的OpenCL API代码?”没有任何意义。