Au cours des dernières années, j'ai fait beaucoup de programmation SIMD et la plupart du temps je me reposais sur des fonctions intrinsèques du compilateur (comme celles pour la programmation SSE) ou sur la programmation de l'assemblage pour arriver à la substance vraiment chouette. Cependant, jusqu'à présent, je n'ai pratiquement pas trouvé de langage de programmation avec un support intégré pour SIMD. Maintenant il y a évidemment les langages de shaders comme HLSL, Cg et GLSL qui ont un support natif pour ce genre de choses mais je cherche quelque chose qui puisse au moins compiler vers SSE sans autovectorisation mais avec built-in support pour les opérations vectorielles. Est-ce qu'une telle langue existe?Langages de programmation SIMD
Ceci est un exemple de (une partie de) un shader Cg qui fait le point et en termes de syntaxe c'est probablement le plus proche de ce que je cherche.
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 qui serait un véritable must dans cette langue est:
- Construit opérateurs swizzle
- opérations vectorielles (points, croix, normaliser, sature, reflètent etc. et)
- Prise en charge des types de données personnalisés (structures)
- La dérivation dynamique serait intéressante (pour les boucles, si les instructions)
Ces implémentations Fortran utilisent toujours la vectorisation automatique de la même manière que la plupart des compilateurs C++. Le problème que j'ai avec cela est qu'il est très difficile de prédire quel code sera vectorisé et quel code ne le sera pas. Maintenant je ne connais pas l'état de ceci dans les compilateurs Fortran parce que mon expérience est en C++, donc je pense que je préférerais une approche de type shader de haut niveau qui me donne plus de contrôle sur la sortie finale. –