W ciągu ostatnich kilku lat zajmowałem się programowaniem SIMD i przez większość czasu polegałem na wewnętrznych funkcjach kompilatora (takich jak te do programowania SSE) lub na programowaniu aby dostać się do naprawdę fajnych rzeczy. Jednak do tej pory nie byłem w stanie znaleźć żadnego języka programowania z wbudowaną obsługą SIMD.Języki programowania SIMD
Teraz oczywiście istnieją języki modułu cieniującego, takie jak HLSL, Cg i GLSL, które mają natywne wsparcie dla tego rodzaju rzeczy, ale szukam czegoś, co jest w stanie skompilować przynajmniej do SSE bez automatycznego uwewnętrznienia, ale z wbudowanym obsługa operacji wektorowych. Czy taki język istnieje?
To jest przykład (części) cieniowania Cg, który działa w świetle punktowym i pod względem składni jest prawdopodobnie najbliższy temu, czego szukam.
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);
}
Stuff to byłby prawdziwy musi w tym języku brzmi:
- Wbudowany operatorów swizzle
- operacje wektorowe (kropka, krzyż, normalizują, nasycić, odzwierciedlają et cetera)
- Obsługa niestandardowych typów danych (struktur)
- Dynamiczne rozgałęzienie byłoby miłe (dla pętli, jeśli instrukcje)
Te implementacje Fortranu nadal używają wektoryzacji automatycznej w taki sam sposób, w jaki obsługuje to większość kompilatorów C++. Problem z tym jest taki, że bardzo trudno jest przewidzieć, jaki kod będzie wektoryzowany, a który nie. Teraz nie znam stanu tego w kompilatorach Fortran, ponieważ moje środowisko jest w C++, więc myślę, że wolałbym podejście do shaderów na wysokim poziomie, które daje mi większą kontrolę nad końcowym wyjściem. –