Negli ultimi due anni, ho eseguito molta programmazione SIMD e il più delle volte mi sono basato sulle funzioni intrinseche del compilatore (come quelle per la programmazione SSE) o sull'assemblaggio di programmazione per ottenere le cose davvero belle. Tuttavia, fino ad ora non sono stato in grado di trovare alcun linguaggio di programmazione con supporto integrato per SIMD.Linguaggi di programmazione SIMD
Ora ovviamente ci sono i linguaggi shader come HLSL, Cg e GLSL che hanno il supporto nativo per questo genere di cose, tuttavia, sto cercando qualcosa che sia in grado di compilare almeno in SSE senza autovectorization ma con built-in supporto per le operazioni vettoriali. Esiste un tale linguaggio?
Questo è un esempio di (parte di) uno shader Cg che fa un riflettore e in termini di sintassi questo è probabilmente il più vicino a quello che sto cercando.
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);
}
Roba che sarebbe un vero e proprio must in questa lingua è:
- Costruito nel operatori swizzle
- operazioni vettoriali (punti, croce, normalizzare, saturare, riflettere eccetera)
- Supporto per tipi di dati personalizzati (struct)
- Il branching dinamico sarebbe bello (per cicli, se istruzioni)
Queste implementazioni di Fortran utilizzano ancora la vettorizzazione automatica nello stesso modo in cui la maggior parte dei compilatori C++ supportano questo. Il problema che ho con questo è che è molto difficile prevedere quale codice verrà vettorializzato e quale codice non lo farà. Ora non conosco lo stato di questo nei compilatori Fortran perché il mio background è in C++, quindi penso che preferirei un approccio shader di alto livello che mi dà più controllo sull'output finale. –