Question

Ces dernières années, j'ai beaucoup travaillé sur la programmation SIMD et la plupart du temps, je me suis appuyé sur des fonctions intrinsèques du compilateur (telles que celles de la programmation SSE) ou sur des assemblages de programmation pour arriver à le truc vraiment chouette. Cependant, je n’avais jusqu’à présent trouvé aucun langage de programmation offrant une prise en charge intégrée de SIMD.

Maintenant, il existe évidemment des langages shader tels que HLSL, Cg et GLSL qui prennent en charge ce type de choses en natif. Cependant, je recherche quelque chose capable au moins de compiler au SSE sans autovectorisation mais avec un support intégré. pour les opérations vectorielles. Un tel langage existe-t-il?

C’est un exemple de (partie de) un shader Cg qui fait la part belle aux yeux et dont la syntaxe est probablement la plus proche de ce que je recherche.

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);
}

Ce qui serait vraiment indispensable dans cette langue est:

  • Opérateurs Swizzle intégrés
  • Opérations vectorielles (point, croix, normalisation, saturation, reflet, etc.)
  • Prise en charge des types de données personnalisés (structures)
  • Un branchement dynamique serait bien (pour les boucles, si les instructions)
Était-ce utile?

La solution 3

Ainsi, Intel a récemment publié le ISPC , qui correspond exactement à ce que je recherchais en posant cette question. C’est un langage qui peut se lier au code C normal, à un modèle d’exécution implicite, et prend en charge toutes les fonctionnalités mentionnées dans le post de début (opérateurs swizzle, branches, structures de données, opérations vectorielles, type de shader) et compile pour SSE2, SSE4, Instructions de vecteur AVX, AVX2 et Xeon Phi.

Autres conseils

Votre meilleur pari est probablement OpenCL. Je sais qu'il a surtout été utilisé pour exécuter du code sur des GPU, mais les noyaux OpenCL peuvent également être compilés et exécutés sur des processeurs. OpenCL est fondamentalement C avec quelques restrictions:

  1. Aucun pointeur de fonction
  2. Pas de récursivité

et un tas d'ajouts. En particulier types de vecteurs:

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

Le plus grand inconvénient est que le code doit être clairement défini, OpenCL ne peut pas appeler des bibliothèques arbitraires, etc. Mais si vos noyaux de calcul sont raisonnablement indépendants, vous obtenez un C amélioré avec un vecteur où vous n'avez pas besoin utiliser des composants intrinsèques.

Ici est une référence rapide / feuille de triche contenant toutes les informations suivantes: les extensions.

Ce n'est pas vraiment le langage lui-même, mais il existe une bibliothèque pour Mono ( Mono.Simd ) qui vous exposera les vecteurs et optimisera les opérations correspondantes dans SSE, dans la mesure du possible:

C’est une bibliothèque pour C ++, plutôt que intégrée au langage, mais Eigen est pratiquement invisible une fois vos variables sont déclarés.

Actuellement, la meilleure solution est de le faire moi-même en créant un back-end pour le front-end open source Cg que Nvidia a publié, mais j'aimerais épargner moi-même l'effort, alors je suis curieux de savoir si cela a déjà été fait auparavant. De préférence, je commencerais immédiatement à l’utiliser.

Le langage de programmation D fournit également un accès à SIMD de la même manière que Mono.SIMD.

Ce serait le Fortran que vous recherchez. Si la mémoire sert aux compilateurs open-source (g95, gfortran), ils tireront parti de SSE s’il est implémenté sur votre matériel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top