2のOpenCLのご紹介
この章では、重要な概念のOpenCL規格について説明し、モバイルプラットフォーム上での基本的な知識のOpenCLプログラムを開発します。あなたは詳細な知識OpenCLの詳細をお知りになりたい場合は、「OpenCLの仕様」内の参照を参照してください。すでにOpenCLの基本的な知識と経験を持っている開発者は、この章をスキップすることができますするために、あなたが読むために次の章に直接ジャンプすることができます。
2.1 OpenCLの背景と概要
OpenCLのプログラムは完全にフリーでオープンソースの標準とメンテナンスを開発するためにクロノス・グループによる異種システム間での平行クロスプラットフォームのためにある方法です。OpenCLのデザイン哲学は、開発者が最新の異種システムを活用するのに役立つ巨大なコンピューティングパワーで、クロスプラットフォームのアプリケーション開発が容易になります。
キンギョソウのプラットフォームを使用して、クアルコム副腎GPUシリーズは、GPUのOpenCL電話用の最も初期のフルサポートの一つです。
図異種システムのOpenCL 2-1
図2-1は、サポートのOpenCLの典型的な異種システムを示しています。このシステムは、3つの主要部分で構成されています。
- メインCPUは、本質的に、ディレクター/コントローラ、管理及び制御アプリケーションです。
- GPU、DSP、FPGA、及びハードウェア・アクセラレータを含む複数のOpenCLのデバイス。
- カーネルコードマスタデバイスカーネルコードはコンパイルされ、OpenCLのデバイスを実行するためにダウンロードしました。
2.2携帯電話のOpenCL
近年では、オンチップの電話システム(SOCには)力、複雑さと機能性を計算する際に重要な進歩を遂げました。電話のSOC上のGPU(GPU電話)はGPUのトップ携帯電話の生のコンピューティングパワーのいくつかは、コンソール/分散GPUに到達することができ、非常に強力です(GPUコンピュータ)レベル。
開発者は、このような課題に直面するだろう:どのように効果的にこのような強力なGPUコンピューティングパワーを使用すると、すぐに別のSOCの上のアプリケーションの互換性を維持しながら、GPUの基礎となる実装の詳細なしでアプリケーションを開発する方法がわかりませんか?
OpenCLの作成は、上記課題を解決するものであり、OpenCLのクロスプラットフォームのサポートを簡単に電話のSOC上のコンピューティングパワーを活用するために、開発者を可能にします。OpenCLのを使用することにより、使用が便利なように、画像/音声処理、コンピュータビジョンとマシンビジョンとして、電話でのSOCを使用することができ、多くの場合、芸術を進めました。
クアルコムは、Andreno GPU上でのOpenCLを使用して、正常にも優れた性能、消費電力およびポータブルのラインを示し、多くの例を加速しています。開発したキンギョソウのSOC上のアプリケーションのために、それを強くGPU上のOpenCLアクセラレーションを使用することをお勧めします。
2.3 OpenCLの標準
OpenCLの標準パッケージ2つの側面:OpenCLの実行リアルタイムAPIとOpenCLのC言語仕様(つまり、.clファイルです)。APIは、リソース管理、カーネル分布(異なるGPU上で実行するために配布カーネル関数)、および他の多くのタスクを含むホスト上で実行されている機能のセットを定義し、OpenCLのC言語は、カーネル関数を記述するために使用され、カーネル関数は、(OpenCLのデバイス上で実行されているのOpenCL 装置は図2-1を参照に)。C言語のAPIと、次のセクションで説明します。
(参考図を2-1 、OpenCLのAPIを定義するメインCPU上で実行する、タスクは、カーネルの数に分割する機能、カーネルする分布関数のOpenCL デバイス上で実行されます。)
2.3.1 OpenCLのAPI関数
OpenCLのAPI関数は2種類、プラットフォーム層と、実行時の層に分けることができます。表2-1と表2-2は、プラットフォーム層とリアルタイムで高度な機能のいくつかをまとめたもの。
表2-1のOpenCLプラットフォームレイヤ機能
機能 |
詳細な説明 |
ディスカバリープラットフォーム |
現在のOpenCLプラットフォームが提供されています確認してください |
OpenCLのデバイスが見つかりました。 |
OpenCLのデバイスは、GPU、CPUまたは他のデバイス上で利用可能ました |
クエリ情報のOpenCLデバイス |
クエリのOpenCLデバイス情報は、グローバルメモリのサイズ(グローバルメモリサイズ)、ローカルメモリ(ローカルメモリのサイズ)のサイズなので、上の最大ワーキンググループの数(maximunのワークグループサイズ)とを。そして、デバイスは、(OpenCLの標準および拡張機能で定義された)拡張機能をサポートしていることを確認してください。 |
コンテキスト |
作成、保持および解放のコンテキスト(文脈)としてコンテキスト管理、 |
実行時の層の表2-2 OpenCLの機能
機能 |
詳細な説明 |
受注管理キュー(コマンドキュー) |
デバイスのためのOpenCLコマンドキュー(例えば、GPUなど)とマスター装置(例えばメインCPUのような)アプリケーションとの間の通信は、複数のキューを有することができます。 |
プログラムとのOpenCLカーネル(カーネル)、(コンパイル.clファイル)を作成し、コンパイル |
ダウンロードして、正しくコンパイルするかどうかのカーネルをチェック |
データを実行するためのカーネルの準備、メモリオブジェクトと初期化を作成します |
どのような種類のメモリマーカーの(例えば、読み取り専用、書き込み専用など)?メモリ0の直接のコピーを作成するためにそこにある(0コピーは、第7章で詳しく説明しますか)? |
カーネルコールを作成し、対応するのOpenCLデバイスに提出するには |
どのようにワークグループ(ワークグループ)を使用するには? |
シンクロナス |
メモリの同期(OpenCLの完全なコピーを実行する前に、結果を待つ必要があります)。 |
リソース管理 |
転送動作の結果(マスター・コピーへのOpenCLデバイス上の演算結果)とリソースの解放。 |
これら2つの層はOpenCLのAPIアプリケーションの基本的な要件を記述することで理解します。詳細については、リファレンスドキュメントを参照します。
2.3.2 OpenCL 的C语言(规定如何写.cl文件)
作为C99 标准的一个子集,OpenCL的C语言是用来写能编译和能在设备(以后OpenCL设备就简称设备)上运行的kernel函数的。有C语言编程经验的开发者能够很快上手OpenCL的C语言编程。但是,为了避免一些常见的错误,理解C99标准和OpenCL C语言之间的差别也是至关重要的。下面是两个关键的不同点:
- 由于硬件的限制和OpenCL的执行模型,一些C99的特性在OpenCL上并不支持。比如函数指针,动态内存分配(malloc/calloc等)
- OpenCL语言在某些方面扩展了C99标准,是为了更好的服务编程模型和方便开发。比如:
- OpenCL添加了内建函数来查询OpenCL内核的执行参数。
- 为了更好的使用GPU硬件,添加了图片加载和存储函数。
2.3.3 OpenCL的版本和概述
当前的OpenCL v2.2和临时SPIR-V 1.2标准包含了许多改进的特性。可参照参考目录获取更多细节。
OpenCL定义了两种profiles(不好翻译),嵌入式的profiles和完整的profiles。嵌入式的profiles主要是用于手机设备,相比于传统的计算设备比如台式机的GPUs,手机设备的计算精度更低,硬件特性更少。参考文档列出了嵌入式profiles和完整profiles之间的主要不同点。
2.4 OpenCL的可移植性和向后兼容性
2.4.1 程序的可移植性
作为一个被严格定义的计算标准,OpenCL有很好的可移植性。如果程序没有使用任何供应商特有的特性或者平台特有的扩展或特性,针对一个供应商平台写的OpenCL程序可以很好地在另一个供应商平台上运行。
OpenCL程序的兼容性已经被Khronos的验证程序保证了。如果OpenCL供应商声称他们是符合OpenCL标准的,Khronos的验证程序会要求OpenCL供应商在他们的平台上通过严格的一致性测试。
2.4.2 性能的可移植性
不像程序的可以执行,OpenCL的性能并不是可移植的。作为一个高级别的计算标准,OpenCL的硬件实现是取决于供应商的。不同的硬件供应商有不同的硬件架构,每一种架构都有它自己的优势和劣势。所以,针对某一个供应商平台开发和优化的OpenCL的应用程序,在另一个供应商的平台上可能不会有同样的性能
甚至对于同一个供应商,他们的不同系列的GPU硬件在微观架构和特性上都会有所不同,这样也会导致OpenCL程序表现出显著的性能差异。所以,针对老一代的硬件优化的程序经常需要进行一些调整,来充分发挥新一代硬件的运算能力。
2.4.3 向后兼容性
OpenCL能够完全向后兼容,来保证针对OpenCL旧版本的代码能够毫无问题的运行在新版本的OpenCL上。不过需要注意,因为有些API函数在新版本已经废弃不使用了,所以如果包含了OpenCL2.x版本头文件中并且使用了OpenCL 1.1 或者OpneCL1.2中过时的APIs,那么需要定义宏 CL_USE_DEPRECATED_OPENCL_1_1_APIS 或者CL_USE_DEPRECATED_OPENCL_1_2_APIS。
OpenCL的扩展并不保证在新的设备上能够继续使用,所以使用扩展功能的应用程序必须检查新的设备是否支持他们。