OpenCL 简介
OpenCL 简介视频讨论了 OpenCL 作为一种用于高性能异构数据并行计算的低级语言,支持多种类型的设备,包括 CPU、GPU 和 FPGA。 OpenCL 于 2008 年成为开放标准,并得到了 Intel、Nvidia 和 AMD 等公司的大力支持。虽然 OpenCL 经常与 CUDA 进行比较,后者具有更好的工具、功能和 Nvidia 的支持,但 OpenCL 支持更多的设备,使其在制造商中得到更广泛的应用。对于个人项目,演讲者建议使用 CUDA 以获得更好的工具和优化,而 OpenCL 推荐用于需要支持不同 GPU 的专业产品。
- 00:00:00 在本节中,演讲者介绍了 OpenCL 作为一种用于高性能异构数据并行计算的低级语言。 OpenCL 可以支持多种类型的设备,包括 CPU、GPU 和 FPGA,并且基于 C 99,允许跨设备移植。 OpenCL 还提供一致的向量表达方式,并拥有共享的数学库和 OpenCL 认证流程,可确保精度得到保证。演讲者指出,OpenCL 于 2008 年成为开放标准,得到了英特尔、Nvidia 和 AMD 等公司以及爱立信、诺基亚和德州仪器等嵌入式设备制造商的大力支持。虽然 OpenCL 经常与 CUDA 进行比较,后者具有更好的工具、功能和 Nvidia 的支持,但 OpenCL 支持更多的设备,使其在制造商中得到更广泛的应用。
- 00:05:00 在本节中,演讲者讨论了 CUDA 和 OpenCL 之间的差异,以及何时为不同的目的选择一个而不是另一个。对于个人项目,演讲者建议使用 CUDA 以获得更好的工具、调试器和优化。但是,对于需要支持不同GPU的专业产品,演讲者推荐使用OpenCL,因为它是支持非Nvidia GPU的唯一途径,并且也在多家公司的支持下不断发展。谈到课程,演讲者建议使用 CUDA 以获得更好的工具和简化的编码,但 OpenCL 可能更易于使用以利用所有计算资源。
![Introduction to OpenCL (1) Introduction to OpenCL (1)](https://c.mql5.com/36/68/introduction-to-opencl-1__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 有什么用处?
视频中的演讲者谈到了将 OpenCL 用于数据并行和单精度计算密集型程序的优势。 GPU 专为图形而设计,由于数学运算占内存运算的比例很高,因此非常理想。演讲者解释说,强度较高的循环会花费更多时间进行数学运算,而 GPU 在这方面表现出色,而强度较低的循环则将大部分时间花在等待内存访问上。本节还探讨了数据并行性,它涉及对大量数据执行相同的独立操作。演讲者还讨论了 OpenCL 中单精度和双精度的使用,其中双精度的执行成本更高,因为它需要的数据量是单精度的两倍。
- 00:00:00 在本节中,演讲者解释说 OpenCL 适用于数据并行和单精度的计算密集型程序。 GPU 是为图形设计的,非常适合这些类型的程序,因为它们是计算密集型的,数学运算占内存运算的比例很高。数学速度很快,而内存速度很慢,所以大量的数学运算会让机器很忙,而内存访问会减慢机器的速度。演讲者解释说,低强度循环大部分时间都在等待内存,而高强度循环则花费更多时间进行数学运算,而这正是 GPU 的优势所在。本节还探讨了数据并行性,这意味着对大量数据执行相同的独立操作。示例包括修改图像中的像素或更新网格上的点。
- 00:05:00 在本节中,演讲者解释了 OpenCL 中数据并行执行的工作原理。他说,本质上是对大量数据进行独立操作,这叫数据并行执行。演讲者继续解释说,这种类型的执行可能会由于对数据所做的计算的变化而导致性能损失,例如在对不同颜色的像素执行操作时可能发生的变化。然后他讨论了 OpenCL 中单精度和双精度的使用,指出双精度需要的数据是单精度的两倍,因此执行起来更昂贵。
![What is OpenCL Good for? (2) What is OpenCL Good for? (2)](https://c.mql5.com/36/68/what-is-opencl-good-for-2__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 中的局部和全局维度
该视频深入探讨了 OpenCL 中全局和局部维度的概念,以及如何使用它们来指定代码执行中的并行性。全局维度是 1D、2D 或 3D 数组,用于确定每次内核执行要执行的线程数或工作项数。例如,如果全局维度是一个包含一千个点的 3D 数组,则每个点都将执行一个线程或工作项。同时,本地维度将全局维度划分为本地工作组或一起运行的线程组,便于同步。同步只允许在同一工作组内进行,因此选择允许所需同步的本地维度至关重要。总而言之,全局维度为每个内核执行建立线程或工作项的数量,而局部维度将全局维度划分为支持同步的工作组。选择合适的局部维度对于同步至关重要,因为它只能发生在同一工作组中。
![Local and Global Dimensions in OpenCL (3) Local and Global Dimensions in OpenCL (3)](https://c.mql5.com/36/68/local-and-global-dimensions-in__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 中局部维度的问题
该视频探讨了与 OpenCL 中的局部维度相关的几个问题,包括同步限制和设备利用率。同步仅限于 GPU 上的同一个工作组,全局同步代价高昂,只能在内核执行结束时使用。选择合适的本地工作组大小对于避免浪费硬件至关重要,演讲者建议选择物理硬件大小的合适倍数的维度。该视频最后推荐了一种试错法来找到最佳性能的最佳尺寸。
- 00:00:00 在本节中,视频探讨了在 OpenCL 中选择局部维度时与同步和设备利用率相关的两个问题。本地工作组大小限制为 512 个线程,最多 1024 个,具体取决于代码复杂度,并且同步只能发生在同一工作组内。该视频使用缩减应用程序来演示同步的工作原理以及工作组大小带来的限制。该视频将有限的同步能力归因于 GPU 可扩展性需求以及支持芯片上其他地方的任意同步的成本。
- 00:05:00 在本节中,视频探讨了 OpenCL 中局部维度的问题。第一个例子展示了使用自旋锁是如何导致死锁的,因为调度程序缺乏对前进进度的保证。该视频还解释说,全局同步只能在内核执行结束时完成,这使得它变得昂贵并迫使程序员仔细规划他们的算法。另一个问题是当本地工作组大小与计算单元大小不匹配时的设备利用率。这会导致部分硬件被浪费,为了避免这个问题,程序员需要选择能够很好地解决问题并与硬件大小相匹配的维度。
- 00:10:00 在本节中,演讲者讨论了影响 OpenCL 中局部维度选择的因素。他们解释说,在 GPU 上,最好有超过 2,000 个物理硬件大小的好倍数的工作项,例如视频 64 和 AMD 有 16 或 3,200 个。对于 CPU,最好有两倍数量的 CPU 内核,但这可能因所使用的算法而异。演讲者建议反复试验,直到获得最佳表现。
![Issues with local dimensions in OpenCL (4) Issues with local dimensions in OpenCL (4)](https://c.mql5.com/36/68/issues-with-local-dimensions-in__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 计算内核
讲师解释说,OpenCL 内核是用于并行计算的 C99 代码。内核并行执行数千次,是计算的内部循环。矢量、精确舍入和转换以及内部函数等 OpenCL 特性可确保准确性。 OpenCL 的实用函数提供有关工作项的信息,例如 ID、维度和组 ID,从而允许创建可以调整的灵活内核。但是,使用 OpenCL 库函数意味着要权衡偏好和精度,因为并行代码操作重新排序会影响执行顺序和更改结果,从而使确定性执行不可能在所有设备上进行。
- 00:00:00 在本节中,讲师解释说 OpenCL 内核基本上只是 C99 代码,用于指定将并行完成的计算。该代码并行执行数千次,是计算的内循环。然后,讲师给出了一个 C 函数示例,以及如何使用 OpenCL 内核并行执行它。他还谈到了 OpenCL 的一些特性,例如向量、控制舍入和转换的显式能力以及具有保证准确性的内部函数。 OpenCL 的实用函数还提供有关每个工作项的信息,例如工作项 ID、维度、特定维度中的最大数量和组 ID,这有助于编写灵活的内核,这些内核可以聪明地确定它们应该做什么工作.总体而言,OpenCL 通过提供有保证的可用性和精度,增强了编写可移植和高性能代码的能力。
- 00:05:00 在本节中,演讲者解释了在使用 OpenCL 合规性库函数时偏好与精度之间的权衡。尽管这些函数在测试时保证了精度,但这并不一定意味着应用程序会在所有 OpenCL 机器上生成相同的结果。原因是编译器可能会重新排序并行代码中的操作,影响执行顺序并可能改变最终结果。因此,虽然在这些库函数上构建代码是首选,但无法保证在所有设备上的确定性执行。
![OpenCL Compute Kernels (5) OpenCL Compute Kernels (5)](https://c.mql5.com/36/68/opencl-compute-kernels-5__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 中的数据移动
该视频讨论了 OpenCL 中的数据移动,演讲者解释了在主机内存和 GPU 之间复制数据所需的手动步骤,以及全局内存和本地内存之间的速度差异。 GPU 中的全局内存访问速度更快,但从主机内存到 GPU 的数据获取速度较慢。 OpenCL 中的本地内存可以通过大量带宽提供改进的性能,但比缓存更难使用,因为它需要手动分配。现代 Nvidia GPU 提供手动管理本地内存或将其用作缓存的选择,推荐的方法是在优化本地数据移动之前从缓存开始。
- 00:00:00 在本节中,演讲者讨论了 OpenCL 中数据移动的工作原理,以及将数据从主机内存复制到 GPU 并返回所需的手动步骤。 GPU 具有比主机内存访问速度快得多的全局内存,但由于 PCIe 总线,从主机内存到 GPU 的数据获取速度很慢。 GPU 还具有具有海量带宽的本地内存,使用它可以显着提高性能。然而,分配和复制数据到本地内存需要在每个计算单元中手动完成,这是一项繁琐的工作。
- 00:05:00 在本节中,演讲者讨论了 OpenCL 中的本地内存(范围从 16 到 48 KB),以及它如何提供每秒数千 GB 的更高带宽。但是,本地内存比缓存更难使用,因为缓存会自动放置最近使用的数据,而不需要为不同的数据分配内存的不同部分,而本地内存则需要手动分配。现代 Nvidia GPU 允许在手动管理本地内存或将其用作缓存之间进行选择,推荐的方法是在优化本地数据移动之前从缓存开始。
![Data Movement in OpenCL (7) Data Movement in OpenCL (7)](https://c.mql5.com/36/68/data-movement-in-opencl-7__1.jpg)
OpenCL 运行时架构
该视频讨论了 OpenCL 平台的架构,包括通过内存总线连接的 GPU 和 CPU 等设备。 OpenCL 上下文也被解释为平台内的设备分组,允许优化它们之间的数据传输。引入命令队列作为向不同设备提交工作的一种方式,但由于没有自动分配,因此需要手动在设备之间分配工作。
![OpenCL Runtime Architecture (6) OpenCL Runtime Architecture (6)](https://c.mql5.com/36/68/opencl-runtime-architecture-6__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 中的数据移动
该视频讨论了 OpenCL 中的数据移动,演讲者解释了在主机内存和 GPU 之间复制数据所需的手动步骤,以及全局内存和本地内存之间的速度差异。 GPU 中的全局内存访问速度更快,但从主机内存到 GPU 的数据获取速度较慢。 OpenCL 中的本地内存可以通过大量带宽提供改进的性能,但比缓存更难使用,因为它需要手动分配。现代 Nvidia GPU 提供手动管理本地内存或将其用作缓存的选择,推荐的方法是在优化本地数据移动之前从缓存开始。
- 00:00:00 在本节中,演讲者讨论了 OpenCL 中数据移动的工作原理,以及将数据从主机内存复制到 GPU 并返回所需的手动步骤。 GPU 具有比主机内存访问速度快得多的全局内存,但由于 PCIe 总线,从主机内存到 GPU 的数据获取速度很慢。 GPU 还具有具有海量带宽的本地内存,使用它可以显着提高性能。然而,分配和复制数据到本地内存需要在每个计算单元中手动完成,这是一项繁琐的工作。
- 00:05:00 在本节中,演讲者讨论了 OpenCL 中的本地内存(范围从 16 到 48 KB),以及它如何提供每秒数千 GB 的更高带宽。但是,本地内存比缓存更难使用,因为缓存会自动放置最近使用的数据,而不需要为不同的数据分配内存的不同部分,而本地内存则需要手动分配。现代 Nvidia GPU 允许在手动管理本地内存或将其用作缓存之间进行选择,推荐的方法是在优化本地数据移动之前从缓存开始。
![Data Movement in OpenCL (7) Data Movement in OpenCL (7)](https://c.mql5.com/36/68/data-movement-in-opencl-7__2.jpg)
OpenCL 你好世界
在此视频中,解释了使用 OpenCL 创建程序并将其提交到 GPU 设备的过程。演讲者逐步介绍了构建程序、创建内核和内存对象以及在 CPU 和 GPU 之间复制数据的步骤。他们还解释了设置内核参数和维度、执行内核以及从 GPU 检索结果的过程。演讲者指出,复杂的内核可能无法在 CPU 和 GPU 上提供最佳性能,可能需要修复以提高性能。他们将在 OpenCL 中编程的过程比作解决数学问题,其中重复操作直到获得所需的结果。
- 00:00:00 在本节中,演讲者解释了设置 OpenCL 和使用它创建程序所需的步骤。首先,需要设置设备和平台,并且必须创建用于执行命令的上下文。然后,创建命令队列以将工作提交给不同的设备。然后编译代码以获取可以提交到队列的内核对象。创建内存对象以在设备之间交换数据,并为内核设置参数。然后内核排队等待执行,数据从设备复制回 CPU。最后,需要完成所有命令并实现等待,以确保数据按预期返回。演讲者还介绍了一个示例 OpenCL Hello World 程序,该程序使用设备并行计算 x 的正弦值。
- 00:05:00 在这部分视频中,演讲者解释了使用 OpenCL 创建程序并将其提交到 GPU 设备的过程。他们首先构建程序,第一次需要更长的时间,但随后的时间就不会了。然后他们通过调用 CL create kernel 为程序中的特定内核创建内核对象。之后,他们创建一个内存对象,在设备上分配一个空间,然后使用 CL in queue write buffer 将数据从 CPU 复制到 GPU。然后说话者设置内核参数和维度,并使用 Q nd 范围内核中的 CL 执行内核。最后,说话者从 GPU 中检索结果并通过调用 CL finish 等待一切完成。演讲者最后指出,复杂的内核可能无法在 CPU 和 GPU 上提供最佳性能,可能需要修复以提高性能。
- 00:10:00 在本节中,演讲者解释说,编程通常涉及重复某些命令,直到获得所需的最终输出。他将其比作解决数学问题,在数学问题中,人们会反复进行一组运算,直到得出正确答案。他指出,这个过程与使用 OpenCL 时类似,其中编程命令会重复多次,直到获得所需的结果。
![OpenCL Hello World (8) OpenCL Hello World (8)](https://c.mql5.com/36/68/opencl-hello-world-8__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL 性能提示和总结
该视频讨论了优化 OpenCL 性能的技巧,包括最小化数据传输、优化内存访问、使用生产者-消费者内核以及利用向量和快速数学函数。演讲者强调适合 GPU 的应用程序应该是数据并行的、计算密集型的、避免全局同步的、适应单精度的并且可以使用小缓存进行管理。如果 OpenCL 性能不佳,可能需要重新考虑算法并优化内存局部性、共享或本地内存,并避免工作项之间不必要的同步。
- 00:00:00 在本节中,演讲者讨论了优化 OpenCL 性能的技巧,包括通过尽可能长时间地在设备上保留数据以及使用生产者-消费者内核链来最大限度地减少 CPU 和 GPU 之间的数据传输。演讲者还强调了通过优化内存合并和管理 GPU 上的本地内存来优化内存访问的重要性。此外,演讲者指出,使用向量可以提高某些硬件的性能,使用某些数学函数的快速或本机变体可以显着提高速度。最后,演讲者讨论了非常适合 GPU 的应用程序的特征,包括数据并行、计算密集型、不需要全局同步、适应单精度以及易于使用小缓存进行管理。
- 00:05:00 在本节中,演讲者建议如果您在使用 OpenCL 时遇到性能不佳的情况,您可能需要重新考虑您的算法并选择一个更适合并行处理模式的算法。这可能涉及更改代码的顺序或结构以优化内存局部性、利用共享内存或本地内存以及避免工作项之间不必要的同步。
![OpenCL Performance Tips and Summary (10) OpenCL Performance Tips and Summary (10)](https://c.mql5.com/36/68/opencl-performance-tips-and-summary__1.jpg)
- 2016.04.06
- www.youtube.com
OpenCL是一种开源框架,用于编写可在各种类型硬件平台(例如中央处理器 (CPU)、图形处理单元 (GPU) 和其他专用处理器或硬件加速器)上执行的程序。无论供应商或架构如何,OpenCL都可使软件开发人员编写可以在多个设备上运行的代码。
OpenCL API和运行时间提供了一定的平台独立性,允许创建可在任何支持OpenCL的设备上运行的代码。OpenCL还提供一组低级别API,使开发人员可以明确控制设备、内存和内核执行,从而对他们的应用程序进行更详细地控制。
OpenCL广泛应用于科学计算、图像视频处理、机器学习等领域。利用跨设备的并行计算能力来更快、更高效地执行应用程序。
OpenCL最明显的优势之一是能够利用GPU的处理能力,从而实现比CPU更快的计算。这使得它尤其适用于需要大量计算的应用程序,例如科学建模、图像和视频处理以及机器学习。
OpenCL提供了一个灵活的框架来开发可以利用不同计算设备能力的应用程序,使其成为开发高性能计算应用程序的工作人员的宝贵工具。
MQL5自2012年起支持OpenCL。有关详细信息,请参阅MQL5参考中的使用OpenCL。另请参阅:使用OpenCL程序的类 。
OpenCL用法示例可以在MQL5\Scripts\Examples\OpenCL中找到。
下面是MQL5中的OpenCL Seascape示例
相关文章:
OpenCL:从原始编程到更有洞察力的编程
如何安装和使用OpenCL进行计算
通过在Linux上将内置支持重新创建为DLL来理解并有效地使用OpenCL API(第1部分):动机和验证