Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.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
C++ 一个包含多个OpenCL内核的程序相对于多个每个都有一个内核的程序的优势是什么?_C++_C_Opencl - Fatal编程技术网

C++ 一个包含多个OpenCL内核的程序相对于多个每个都有一个内核的程序的优势是什么?

C++ 一个包含多个OpenCL内核的程序相对于多个每个都有一个内核的程序的优势是什么?,c++,c,opencl,C++,C,Opencl,这个问题源于我希望在运行时从各种内核构建一个OpenCL程序。因此,假设我有各种内核,我希望在给定的上下文中使用相同的内存对象集执行它们 如果我提前知道我想要组合成一个程序的所有内核,我就不会有问题了——只需创建一个包含所有内核源代码或二进制文件的程序 然而,考虑到我不知道要提前组合哪些内核,我正在考虑为每个内核源创建一个程序。这是否等同于原始情况(假设编译时选项都相同)?调用驻留在不同程序中的内核会有性能损失吗 问题可能是我不理解“程序”的抽象。这是怎么一回事?它不仅仅是内核集合和一些编译时选

这个问题源于我希望在运行时从各种内核构建一个OpenCL程序。因此,假设我有各种内核,我希望在给定的上下文中使用相同的内存对象集执行它们

如果我提前知道我想要组合成一个程序的所有内核,我就不会有问题了——只需创建一个包含所有内核源代码或二进制文件的程序

然而,考虑到我不知道要提前组合哪些内核,我正在考虑为每个内核源创建一个程序。这是否等同于原始情况(假设编译时选项都相同)?调用驻留在不同程序中的内核会有性能损失吗


问题可能是我不理解“程序”的抽象。这是怎么一回事?它不仅仅是内核集合和一些编译时选项吗

将OpenCL内核分组到单个程序中有几个好处:

  • 通过多次
    clBuildProgram()
    调用多次调用编译器的(轻微)开销。这可以通过将单个源字符串编译成单个程序,然后从中创建多个内核来避免。但是,在获得内核对象之后,基于它来自的程序,性能应该没有差异

  • 更重要的好处是:在程序中将内核分组在一起,使它们能够相互引用和使用和/或其他相关的辅助函数

    示例:一个程序可能定义一个函数,在球面坐标和笛卡尔坐标之间进行转换,然后多个内核可以使用该函数,而无需复制其源


  • 啊,这是有道理的。因此,在内核不相互引用的情况下,一个涉及多个程序的解决方案,因为它使主机代码更简单,并不是一个疯狂的解决方案。我们实际上使用尽可能少的程序,正是因为它使主机代码和开发内核对我们来说更简单。我们只需在一个.cl文件中编写与单个事物相关的内核,将其读入内存并将其传递给clCreateProgramWithSource。例如,我们在一个.cl文件中有FFT内核。sharpneli说得对,但我发现这并不是普遍正确的。我的观点不是说一般来说很少有程序不是更好的,而是在我们有多个内核可能出现或消失的特定情况下,多个程序不是一个坏方法。