2016-08-01 5 views
1

OpenCLで変数を別の型にキャストするコストはいくらですか?OpenCL:型変換のオーバーヘッド

例:私は2つのint3ベクトル(私の知る限りdot()int3秒間オーバーロードされていない)の内積を取りたいので、代わりにunvectorized方法で、自分でdot()を実装するので、私が使用してコードをベクトル化したいですネイティブdot()float3です。まず、2つのベクトルをfloat3に変換してから、結果をintにキャストします。

foobarという2つの機能のどちらが、時間の節約になります(なぜですか)。

inline int foo(int3 a, int3 b) { 
    return a.x*b.x + a.y*b.y + a.z*b.z; 
} 

inline int bar(int3 a, int3 b) { 
    return (int)dot(convert_float3(a), convert_float3(b)); 
} 
+0

最適化の第1のルール:尺度。最適化の第2のルール:再び測定する。これは完全にハードウェアとアーキテクチャに依存します。誰もあなたの質問に決定的な答えを与えることはできません。 –

+0

@AndreasPapadopoulos私は同意します。ちなみに、もっと細かいプロファイリング方法、つまり、* whole *カーネルの実行時間を見るのではなく、カーネルの個々のコマンド(AppleのMetalのようなもの)の実行時間を見てみましょう。 – sarasvati

+0

@AndreasPapadopoulosでアイデアをよりよく説明するには、XCodeの[このプロファイリングセッションイメージ](https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Art/xcode_gpu_overview_program_2x.png)をご覧ください。 。各コード行に費やされた時間の割合を示します。 – sarasvati

答えて

1

としては、測定は実際に最も有用なツールになるだろう、と個々の命令のコストは、ハードウェアアーキテクチャ、だけでなく、コンパイラに大きく依存して、コメントで示唆されています。

しかし、他の操作との比較は有用であり、少なくともAMDはデバイスの命令スループットのリストをthis section of their OpenCL optimisation guideに公開しています。これにはfloat-to-intとint-to-float変換が含まれます。

具体的には、「ベクトル化」の試みが有害な影響を及ぼすことが強く疑われます。最新のGPUのほとんどは、CPU SIMDの意味でのSIMDプロセッサではありません。スレッドはロックステップで実行されますが、各スレッドはスカラーで動作します。ドット積のような「水平」演算は、GPUがスレッド毎のSIMDを使用しても特に効率的ではない可能性がある。

各整数の範囲を24ビットに制限できる場合は、mad24()mul24()の一連の呼び出しが最も高速になる可能性が最も高いです。しかし、再び - 測定。さまざまなハードウェアでさまざまなオプションを試してみて、それらを何度も実行し、基本的な統計を適用して、ばらつきやオーバーヘッドがランダムでないことを確認してください。

整数から浮動小数点への変換に関して注意すべき点は、整数を含む画像オブジェクトから浮動小数点としてサンプリングするときに、そのような変換がしばしば「フリー」であることです。