Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 如何调查opencl是否适用于算法_Algorithm_Opencl - Fatal编程技术网

Algorithm 如何调查opencl是否适用于算法

Algorithm 如何调查opencl是否适用于算法,algorithm,opencl,Algorithm,Opencl,我有一个C语言的重载算法,它获取两个大约10000x5000的大型位图,并在3D模型上执行照片和光线碰撞操作,以将照片映射到3D模型上 我想知道是否有可能将这种算法转换为OpenCL,以优化算法期间的并行操作。但在要求您深入了解算法的细节之前,我想知道如何调查我的算法是否可转换为OpenCL 我在OpenCL方面没有经验,我想知道是否值得进入它并了解它是如何工作的。是否有我必须寻找的东西在图形卡上肯定不起作用?对于循环,递归 更新: 我的算法是这样的: foreach photo spl

我有一个C语言的重载算法,它获取两个大约10000x5000的大型位图,并在3D模型上执行照片和光线碰撞操作,以将照片映射到3D模型上

我想知道是否有可能将这种算法转换为OpenCL,以优化算法期间的并行操作。但在要求您深入了解算法的细节之前,我想知道如何调查我的算法是否可转换为OpenCL

我在OpenCL方面没有经验,我想知道是否值得进入它并了解它是如何工作的。是否有我必须寻找的东西在图形卡上肯定不起作用?对于循环,递归

更新:

我的算法是这样的:

foreach photo
    split the photo in 64x64 blocks
    foreach block
        cast a ray from the camera to the 3D model
        foreach triangle in 3D model
            perform raycheck

针对您的具体问题:for循环虽然不是最优的,但很好;递归在GPU上是不可能的

一般来说,在GPU上运行良好的算法需要有大量独立的数据并行操作。很多位图操作都属于这一类,另一方面,光线跟踪可能具有挑战性

如果您可以修改您的算法,以便在最高级别有数千个独立的块,那么块中较低级别的依赖关系应该可以


关于这样一个一般性的话题,我想我能说的就这些了。

对于您的具体问题:for循环虽然不是最优的,但很好;递归在GPU上是不可能的

一般来说,在GPU上运行良好的算法需要有大量独立的数据并行操作。很多位图操作都属于这一类,另一方面,光线跟踪可能具有挑战性

如果您可以修改您的算法,以便在最高级别有数千个独立的块,那么块中较低级别的依赖关系应该可以


我想关于这样一个一般性的话题,我只能说这些了。

是的,opencl非常适合这种类型的工作。光线投射是一个gpu硬件可以发光的地方

一种划分方法是:

foreach photo - work done by host application. (openmp?)
foreach block - use one opencl work group per block
foreach triangle in 3D model - single work item
<> P>在实现该算法时还有一些其他的事情要考虑。 1每个块是否始终要投射64^2条光线

2光线“击中”图像和/或几何体的比例是多少?条件分支将影响gpu硬件上的性能

3您是否考虑过从几何角度而不是从图像角度进行铸造?即foreach三角形、foreach顶点、从摄影机投射光线并检测屏幕上的位置。您可能能够对三角形上的其余点进行插值,并对结果进行z缓冲,以防止重新绘制像素


4如果您只处理图形,opengl/directx是否已经具备您所需的功能?

是的,opencl非常适合此类工作。光线投射是一个gpu硬件可以发光的地方

一种划分方法是:

foreach photo - work done by host application. (openmp?)
foreach block - use one opencl work group per block
foreach triangle in 3D model - single work item
<> P>在实现该算法时还有一些其他的事情要考虑。 1每个块是否始终要投射64^2条光线

2光线“击中”图像和/或几何体的比例是多少?条件分支将影响gpu硬件上的性能

3您是否考虑过从几何角度而不是从图像角度进行铸造?即foreach三角形、foreach顶点、从摄影机投射光线并检测屏幕上的位置。您可能能够对三角形上的其余点进行插值,并对结果进行z缓冲,以防止重新绘制像素


4如果您只是在处理图形,opengl/directx是否已经具备了您所需要的功能?

在使用OpenCL之前,我将采取中间步骤,将其转换为多线程C程序。从这一步开始,你已经观察到了速度的大幅提升,这要容易得多。另外,要在OpenCL中编写内核,您需要使用OpenCLC,它与普通C非常相似——因此,从这个中间步骤开始的翻译步骤将比直接从C开始更容易

最终,要实现OpenCL版本,你需要做的是与GPU共享主机上的照片内存。事实上,对于图像,它有专门的内存API,只用于知道像素编码的图像,与OpenGL兼容,然后创建一个raycheck内核,然后从主机队列中为每个块/三角形设置raycheck内核

这里有ATI关于OpenCL的精彩介绍


在OpenCL中执行此操作之前,我将采取中间步骤,将其转换为多线程C程序。从这一步开始,你已经观察到了速度的大幅提升,这要容易得多。另外,要在OpenCL中编写内核,您需要使用OpenCLC,它与普通C非常相似——因此,从这个中间步骤开始的翻译步骤将比直接从C开始更容易

最后,要使用OpenCL版本,您必须与GPU共享来自主机的照片内存 事实上,对于图像,它有专门的内存API,只用于那些知道像素编码以某种方式与OpenGL兼容的图像,然后创建一个光线检查内核,然后从主机队列中为每个块/三角形创建光线检查内核

这里有ATI关于OpenCL的精彩介绍


我已经找到了一些从点到球体的光线跟踪示例,但我可以想象,对于平面或三角形,同样的情况也可能发生。在正确的块中分离可能会有点困难,因为我不知道在什么级别上分割数据。也许这可以说明你的答案。我已经找到了一些从点到球体的光线跟踪示例,但我可以想象,对于平面或三角形,同样的情况也可能发生。在正确的块中分离可能会有点困难,因为我不知道在什么级别上分割数据。也许这可以说明你的答案。谢谢你的提示!射线的命中率相当高,因为几何体是基于图片的。因此,只有几何体边缘的图片具有较低的命中光线。谢谢提示!射线的命中率相当高,因为几何体是基于图片的。因此,只有几何体边缘的图片具有较低的命中率。我安装了Cloo项目,它在C和OpenCL之间建立了良好的连接。多线程确实是一个好主意,但是有些笔记本电脑需要10分钟才能完成。我认为这提供了一个主机API的C包装器,但是你仍然必须用OpenCL C编写内核。对吗?我安装了Cloo项目,它在C和OpenCL之间建立了良好的连接。多线程确实是一个好主意,但是一些笔记本电脑需要10分钟才能完成。我认为这提供了一个主机API的C包装器,但是你仍然必须用OpenCLC编写内核,对吗?