質問

ここ数年、私は多くのSIMDプログラミングを行ってきましたが、ほとんどの場合、コンパイラ組み込み関数(SSEプログラミングなど)またはプログラミングアセンブリに依存して、本当に気の利いたもの。ただし、これまで、SIMDの組み込みサポートを備えたプログラミング言語を見つけることはほとんどできませんでした。

明らかに、この種のものをネイティブにサポートするHLSL、Cg、およびGLSLなどのシェーダー言語がありますが、少なくとも自動ベクトル化せずに組み込みのサポートでSSEにコンパイルできるものを探していますベクトル演算用。そのような言語は存在しますか?

これは、スポットライトを行うCgシェーダー(の一部)の例であり、構文の観点からは、おそらく私が探しているものに最も近いものです。

float4 pixelfunction(
    output_vs IN, 
    uniform sampler2D texture : TEX0, 
    uniform sampler2D normals : TEX1, 
    uniform float3 light, 
    uniform float3 eye ) : COLOR
{
    float4 color    = tex2D( texture, IN.uv );
    float4 normal   = tex2D( normals, IN.uv ) * 2 - 1;

    float3 T = normalize(IN.T);
    float3 B = normalize(IN.B);

    float3 N = 
        normal.b * normalize(IN.normal) +
        normal.r * T +
        normal.g * B;

    float3 V = normalize(eye - IN.pos.xyz);
    float3 L = normalize(light - IN.pos);
    float3 H = normalize(L + V);

    float4 diffuse  = color * saturate( dot(N, L) );
    float4 specular = color * pow(saturate(dot(N, H)), 15);
    float falloff   = dot(L, normalize(light));

    return pow(falloff, 5) * (diffuse + specular);
}

この言語で実際に必要なものは次のとおりです。

  • スウィズル演算子の組み込み
  • ベクトル演算(ドット、クロス、正規化、飽和、反射など)
  • カスタムデータ型(構造体)のサポート
  • 動的な分岐は便利です(forループ、ifステートメント)
役に立ちましたか?

解決 3

それで最近、Intelは ISPC をリリースしました。これはまさにこの質問をするときに探していたものです。これは、通常のCコードとリンクでき、暗黙の実行モデルを持ち、開始ポストで言及されているすべての機能(スウィズル演算子、分岐、データ構造体、ベクトルops、シェーダーなど)をサポートし、SSE2、SSE4、 AVX、AVX2、およびXeon Phiのベクトル命令。

他のヒント

おそらく最善の方法はOpenCLです。 GPUでコードを実行する方法として大部分が宣伝されていることは知っていますが、OpenCLカーネルはCPUでコンパイルして実行することもできます。 OpenCLは基本的にCですが、いくつかの制限があります:

  1. 関数ポインタなし
  2. 再帰なし

および追加の束。特定のベクタータイプ:

float4 x = float4(1.0f, 2.0f, 3.0f, 4.0f);
float4 y = float4(10.0f, 10.0f, 10.0f, 10.0f);

float4 z = y + x.s3210 // add the vector y with a swizzle of x that reverses the element order

大きな注意点は、コードをきれいに実行可能にする必要があること、OpenCLが任意のライブラリなどを呼び出すことができないことです。しかし、計算カーネルが合理的に独立している場合、基本的には必要のないベクトル拡張Cを取得します組み込み関数を使用します。

こちらは、クイックリファレンス/チートシートです。拡張機能。

実際には言語そのものではありませんが、Monoのライブラリがあります( Mono.Simd )を使用して、ベクトルを公開し、可能な限りベクトルに対する操作をSSEに最適化します。

これは、言語に組み込まれているのではなく、C ++のライブラリですが、 Eigen は、変数が表示されると見えなくなります。宣言されています。

現在、最善の解決策は、NvidiaがリリースしたオープンソースCgフロントエンドのバックエンドを作成して自分でそれを行うことですが、努力を節約したいと思っています。できればすぐに使い始めます。

Dプログラミング言語は、Mono.SIMDと同様の方法でSIMDへのアクセスも提供します。

それはあなたが探しているFortranです。メモリがオープンソースのコンパイラ(g95、gfortran)でさえ機能する場合、ハードウェアに実装されていればSSEを利用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top