提供可靠的OpenCL应用程序-工具/技术/提示?

提供可靠的OpenCL应用程序-工具/技术/提示?,opencl,gpgpu,Opencl,Gpgpu,我想发布的OpenCL代码应该可以在所有兼容OpenCL1.1的GPU上运行。有没有什么工具可以帮助确保可靠性,而不是购买一堆GPU并对其进行测试 如果有人有将OpenCL应用程序运送到广泛硬件基地的经验,我会有兴趣了解任何其他测试可靠性的方法。我对此有一点了解。不幸的是,答案是:取决于内核在做什么 我最大的不满是NVIDIA和OpenCL,因为它们似乎不支持向量(float2、4等)和全局偏移。有点讨厌。Intel和ATI都是固态的,但即使如此,矢量大小也可能不同。如果您正在进行图像卷积,上述

我想发布的OpenCL代码应该可以在所有兼容OpenCL1.1的GPU上运行。有没有什么工具可以帮助确保可靠性,而不是购买一堆GPU并对其进行测试


如果有人有将OpenCL应用程序运送到广泛硬件基地的经验,我会有兴趣了解任何其他测试可靠性的方法。

我对此有一点了解。不幸的是,答案是:取决于内核在做什么

我最大的不满是NVIDIA和OpenCL,因为它们似乎不支持向量(float2、4等)和全局偏移。有点讨厌。Intel和ATI都是固态的,但即使如此,矢量大小也可能不同。如果您正在进行图像卷积,上述内容实际上并不重要


如果你想在NVIDIA卡上运行AMD FFT,做矩阵运算,等等,这很重要。为了解决向量问题,你可以编写多个内核,每个内核都有不同的向量大小,并调用正确的一个:MatrixMult_float4(…)。

你可以使用AMD KernelAnalyzer2检查代码是否编译,虽然这确实需要一些组件的催化剂驱动程序,所以它只适用于我的个人电脑与AMD的GPU。还有“英特尔内核编译器”,它适用于支持英特尔OpenCL SDK的设备。Nvidia的实现有缺陷,特别是在我的经验中,在较新的GPU上,因此最好是测试每一代的一个GPU。

为了避免扩展和验证CL语言版本,可以尝试使用LLVM测试编译代码,或者只是获取语法进行验证,例如作为BNF

有一个很有前途的开源项目,它可能包含有用的东西:

然而,我遇到的问题是:

  • 换行符在OpenCL源文件中的某些实现(CR、LF、CRLF)上导致构建中断。将其中一个指定为唯一有效的行尾是愚蠢的。如果在不同平台上结合SCM编辑源文件,可能会带来不便。因此,我在编译之前删除注释并清理换行符
  • 性能:使用多线程高效地为GPU馈电;不同的硬件星座有不同的瓶颈。这里我需要一个具有多个调度程序线程的客户端管道。当然,CPU剩余的工作量取决于任务或能力、计算设备的数量和资源。需要序列化执行或动态循环计数的对象就是这样的候选对象

NVIDIA很好地支持矢量类型,只是没有矢量硬件架构(AMD也没有了)。诚然,您可能希望为特定的硬件架构编写不同的内核,但是向量类型在任何符合OpenCL的实现中都是受支持的,您的声明似乎表明了不同的情况。啊,好的,谢谢您的澄清。但是,某些硬件针对特定的向量长度进行了优化,这可以通过查询首选向量宽度找到。您可以查询每种类型的首选向量宽度,然后在适当(以编程方式)更改的cl内核中使用它。我只使用标量类型,而内核大部分是纯C代码(也不使用任何扩展)将并行处理数据。此外-没有本地或全局隔离。视频卡驱动程序版本也可以发挥作用。我有一些OpenCL代码使编译器崩溃(在构建内核时)在Nvidia硬件上运行时,直到新版本修复它。是的,我遇到过类似的问题。还有旧版本h/w上GPU上的线程被卡住时WDDM超时,操作系统会终止它们。是否有类似于Nvidia h/w的KernelAnalyzer的东西?没有。Nvidia不再为OpenCL提供开发工具。但是,通过使用build选项-cl std=CL1.1(最近的Nvidia GPU),您可以获得几乎相同的结果或者-cl std=CL1.0,用于AMD内核分析程序2中较旧的Nvidia GPU。这将更改内核中使用的OpenCL C版本。感谢您的评论。顺便问一下,您是否知道在生成IL字节码以加快构建方面是否有任何进展?不客气。据我所知,没有IL或CIL。Khronos集团不需要o指定这样的CIL(也许他们可以采用LLVM字节码的子集)。仅为了性能,您可以使用源代码和
clGetProgramInfo()
执行编译过程,以检索每个涉及的特定计算设备生成的二进制文件。这些blob可以存储在文件中,并与
clCreateProgramWithBinary()一起重用
。所有这些与OpenGL二进制着色器格式非常相似。