11

ここ数年、私は多くの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ステートメント)
4

7 に答える 7

7

あなたの最善の策はおそらく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を取得します。 。

これは、すべての拡張機能を含むクイックリファレンス/チートシートです。

于 2009-09-21T14:11:07.470 に答える
6

それは実際には言語自体ではありませんが、Mono用のライブラリ(Mono.Simd)があり、ベクトルを公開し、可能な場合はいつでもそれらの操作をSSEに最適化します。

于 2009-09-13T13:44:56.700 に答える
6

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

于 2012-03-28T21:08:44.400 に答える
2

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

于 2012-03-27T16:16:53.143 に答える
0

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

于 2009-09-13T13:30:45.370 に答える
0

現在のところ、最善の解決策は、NvidiaがリリースしたオープンソースのCgフロントエンドのバックエンドを自分で作成することですが、労力を節約したいので、以前に作成したことがあるかどうか知りたいです。できればすぐに使い始めます。

于 2009-09-17T12:40:54.783 に答える
0

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

于 2012-10-02T21:43:36.647 に答える