opencl チュートリアル
openclを使い始める
サーチ…
備考
このセクションでは、openclの概要と、なぜ開発者がそれを使いたいのかを概説します。
また、opencl内の大きなテーマについても言及し、関連するトピックにリンクする必要があります。 openclのドキュメンテーションは新しいので、それらの関連トピックの初期バージョンを作成する必要があります。
Openclは、gpus、cpus、およびいくつかの他のアクセラレータ(pcie-fpgaなど)をC99のような計算をうまく活用するが、非常に広い同時性の利点を持つAPIです。インストールと基本的な実装が完了すると、カーネル文字列(またはそのファイル)内の単純な変更だけがN個のハードウェアスレッドにアルゴリズムを自動的に適用します。
開発者は、openglやdirect-xで同じことをするよりも、メモリのスペースやスピードを最適化するほうがずっと簡単なので、これを使いたいかもしれません。ロイヤリティフリーです。デバイス内の並行性は暗黙的であるため、各デバイスに対して明示的なマルチスレッドが不要です。しかし、マルチデバイス構成では、CPUマルチスレッドがまだ必要です。たとえば、1000スレッドジョブがCPUに送信されると、スレッド同期はドライバによって処理されます。ワークグループの大きさ(仮想ローカルメモリに接続されている256個など)と同期ポイント(必要な場合のみ)を指定するだけです。
一般的な操作にgpuを使用することは、CPUよりも常に常に高速です。すばやくソートしたり、行列を10倍高速で乗算したり、メモリ内のSQLテーブルを「いいえ」時間に参加させたりすることができます。任意の200 $ cpuより物理的な(有限要素法の流体)作業負荷で、200 $のデスクトップグレードのgpuはすばやく完了します。 Openclは、より簡単で移植性に優れています。 C#での作業が終わったら、同じカーネルとC ++プロジェクト(余分なC ++コンパイルでJNIを使って)を使ってjava-openclの実装に簡単に移行できます。
グラフィックス部分では、必ずしもCPUとGPUの間でバッファを送信する必要はありません。コンテキスト作成部分で "interop"オプションを使用して純粋にgpuで作業することができます。 interopを使用すると、gpuの制限パフォーマンスでジオメトリを準備できます。任意の頂点データにはpci-eは必要ありません。ちょうど「コマンド」が送信され、グラフィックカードの内部で作業が行われます。つまり、データのCPUオーバーヘッドはありません。 Openclはジオメトリデータを準備し、OpenGLはそのデータをレンダリングします。 CPUが解放されます。たとえば、cpuの単一スレッドが10000サイクルで32x32の頂点球を構築できる場合、openclを使用したgpuは1000サイクルで20球を構築できます。
OpenCLとは何ですか?
OpenCLはL openを使用しているOpen Cの略です。 OpenCLは、CPUなどのGPUからFPGAなどの特殊なプラットフォームに至るまで、 コンピューティングデバイスと呼ばれる異種プラットフォーム間の並列プログラミングのためのフレームワークです。 OpenCLは、これらのコンピューティングデバイス上のパラレルコンピューティングのための標準インタフェースを提供しますが、デバイス間の並列性も提供します。 C99に基づくプログラミング言語、およびOpenCL対応デバイスで実装される基本機能の最小要件を指定します。 OpenCLはさらに抽象的なコンピューティングとメモリモデルを記述し、異なるプラットフォーム間でのコードの再利用を可能にするために可能な限り一般的であることを説明します。
前提条件
マシン内に最新のCPUまたはグラフィックスカード(GPU)がある場合は、OpenCLですべての準備が整いました。お使いのプロセッサがOpenCL対応であるかどうかを確認するには、通常、製造元のホームページから行うことができます。
https://www.khronos.org/conformance/adopters/conformant-products#opencl
OpenCLとは何ですか?
Open Computing Language(OpenCL)は、CPU、GPU、その他の並列プロセッサとアクセラレータで実行されるプログラムを記述するためのフレームワークです。
OpenCLは、名前付きオンチップメモリへのアクセス、並行してタスクを実行するためのモデル、およびそれらのタスクを同期させる機能を提供するプログラミング言語(Cに基づく)を指定します。
OpenCL 1.2のC#実装:AMDシステム用プラットフォームの数(64ビット版)
OpenCLは低レベルのAPIなので、最初に "C空間"に実装する必要があります。そのためには、Khronosのサイトからヘッダーファイルをダウンロードする必要があります。私のハードウェアはAMDで、バージョン1.2のダウンロードが可能です
opencl.h
cl_platform.h
cl.h
cl_ext.h
cl_egl.h
cl_dx9_media_sharing.h
cl_d3d10.h
cl_d3d11.h
cl_gl.h
cl_gl_ext.h
cl.hpp
このページから
これらのファイルをプロジェクトに追加し、適切なバイナリ(およびライブラリ)ファイルの場所を設定した後で、C ++バインディングには十分でなければなりません(
$(AMDAPPSDKROOT)\ lib \ x86_64(64ビットamdライブラリ用)(amd app sdkのライブラリが優先されます)
、
C:\ Windows \ SysWOW64 for 64-bit opencl.dll(ICDがLinuxシステムの場合は.soファイル)
たとえばIntel-Nvidiaでは異なる)、適切なドライバをインストールした後でamd、intel、xilinx、nvidiaなどのプラットフォームの一覧を問い合わせることができます(amimのcrimsonなど)。ドライバは(ICDを使用して)openclアプリケーションを実行するためのもので、ライブラリとヘッダファイルは開発のためのものです。
プラットフォームを照会するには:
#define __CL_ENABLE_EXCEPTIONS
#include "stdafx.h"
#include <vector>
#include <CL/cl.hpp>
extern "C"
{
// when this class is created, it contains a list of platforms in "platforms" field.
class OpenClPlatformList
{
public:
std::vector<cl::Platform> platforms;
int platformNum;
OpenClPlatformList()
{
platforms= std::vector< cl::Platform>();
cl::Platform::get(&platforms);
platformNum= platforms.size();
}
};
// this is seen from C# when imported. Creates an object in memory.
__declspec(dllexport)
OpenClPlatformList * createPlatformList()
{
return new OpenClPlatformList();
}
__declspec(dllexport)
int platformNumber(OpenClPlatformList * hList)
{
return hList->platformNum;
}
__declspec(dllexport)
void deletePlatformList(OpenClPlatformList * p)
{
if (p != NULL)
delete p;
p = NULL;
}
}
dll(OCLImplementation.dllなど)に組み込むことができます。
C#側から使用するには、
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace WrapperCSharp
{
public class WrapperCSharp
{
[DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr createPlatformList();
[DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
private static extern int platformNumber(IntPtr hList);
[DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
private static extern void deletePlatformList(IntPtr hList);
}
}
ofcourseのdllはC#プロジェクトで見なければならず、プロジェクトの実行可能ファイルの近くに置くだけで解決します。
ここで、サンプルコンピュータに少なくとも1つのopencl対応プラットフォームがある場合、
IntPtr platformList = createPlatformList(); // just an address in C-space
int totalPlatforms = platformNumber(platformList); // AMD+NVIDIA systems should have "2"
deletePlatformList(platformList); //
totalPlatforms変数には、少なくとも「1」の値が必要です。その後、CPU、GPU、phiやfpgaなどの特別なアクセラレータなどのすべてのデバイスを照会するために、すべてのプラットフォームを反復処理するための追加機能を使用して、C空間でplatform変数を使用することができます。
C ++ラッパーにこれらのすべてのC ++を時間的に重要なプロジェクトに書き込むだけではありません。 C#、Javaおよびその他の言語用に書かれたラッパーが多数あります。 Javaの場合は、「Javaバイトコードからopencl-cへのコンバータ」APIである「Aparapi」があります。これは純粋にJavaでgpu-parallelバージョンに書き込むので、多少の移植性があります。
OpenCLとC#
C#では、OpenCLと通信するためのインターフェイスを提供する多くのラッパーが存在します。
- OpenCL.NET:これは、そこで最も低レベルのラッパーの1つです。これは、抽象化を全く追加することなく、C#用のOpenCL APIの完全な実装を提供します。だからC \ C ++の例はこのライブラリのために簡単に移植されます。唯一のプロジェクトページは現在codeplexにあります。これは2011年12月15日に終了しますが、パッケージはNuGet
https://openclnet.codeplex.com/
- NOpenCL:このライブラリは、C#とOpenCLの間の抽象的なインタフェースを提供します。
短期目標は、パフォーマンスを犠牲にすることなくOpenCLの完全な機能にアクセスするための、使いやすい抽象レイヤーを提供することです。
https://github.com/tunnelvisionlabs/NOpenCL
- Cloo:
Clooは、オープンソースで使いやすく管理されたライブラリであり、.NET / MonoアプリケーションがOpenCLフレームワークを最大限に活用できるようにします。
https://sourceforge.net/projects/cloo/