11
votes

Langues de programmation SIMD

Au cours des deux dernières années, je fais beaucoup de programmation SIMD et que la plupart du temps, je m'appuie sur des fonctions intrinsèques du compilateur (telles que celles de la programmation SSE) ou sur l'ensemble de programmation pour se rendre à les choses vraiment nifty. Cependant, jusqu'à présent, je suis à peine capable de trouver un langage de programmation avec une prise en charge intégrée pour SIMD.

Maintenant, il y a évidemment les langues de shader tels que HLSL, CG et GLSL qui ont un support natif pour ce type de choses Cependant, je cherche quelque chose qui est capable de compiler au moins à la SSE sans autotorisation mais avec un support intégré pour les opérations vectorielles. Un tel langage existe-t-il? P>

Ceci est un exemple de (partie de) une Shader CG qui fait un projecteur et en termes de syntaxe, c'est probablement le plus proche de ce que je recherche. P >

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);
}
  • Construit dans les opérateurs Swizzle Li>
  • Opérations vectorielles (point, croix, normalisée, saturer, reflect et cetera) li>
  • Prise en charge des types de données personnalisés (Structs) LI>
  • La ramification dynamique serait bien (pour les boucles, si des déclarations) li> ul> p>


0 commentaires

7 Réponses :


0
votes

Ce serait Fortran que vous recherchez. Si la mémoire sert même les compilateurs à source ouverte (G95, gfortran) profiteront de SSE si elle est implémentée sur votre matériel.


1 commentaires

Ces implémentations fortraines utilisent toujours une vectorisation automatique de la même manière que la plupart des compilateurs C ++ supportent cela. Le problème que j'ai avec ceci est qu'il est très difficile de prédire quel code sera vectorisé et quel code ne le fera pas. Maintenant, je ne connais pas l'état de cela dans les compilateurs de Fortrans, car mon arrière-plan est en C ++, alors je pense que je préférerais une approche de haut niveau en forme de shader qui me donne plus de contrôle sur la sortie finale.



6
votes

Ce n'est pas vraiment la langue elle-même, mais il y a une bibliothèque pour mono ( Mono.SIMD ) qui vous exposera les vecteurs et optimisera les opérations sur eux dans la SSE dans la mesure du possible:


1 commentaires

Cette solution a l'air bien; semble beaucoup mieux que la intrinsèque C ++. Cependant, la solution est à peu près équivalente et pas ce que je cherche. (Je cherchais des langues réelles conçues avec Simd intégrée au lieu de boulonner). Cependant, c'est certainement quelque chose à retenir lors d'une solution basée sur .NET.



0
votes

Actuellement, la meilleure solution est de le faire moi-même en créant un back-end pour la CG Open-Source Controngende que Nvidia publie, mais j'aimerais me sauver l'effort que je suis curieux si cela a été fait auparavant. De préférence, je commencerais à l'utiliser tout de suite.


2 commentaires

CG n'est pas open source, il est exclusif de Nvidia. Ce serait une quantité énorme de travail pour créer une back-end qui générée du code SIMD pour une CPU. Comme Louis répond, vous devriez vérifier sérieusement Opencl. Vous pouvez écrire des noyaux de traitement dans une langue basée sur C (très similaire à CG et GLSL) et exécutez-la sur le GPU ou la CPU (où il générera un code SIMD pour vous). Opencl est une plate-forme interrogatoire, soutenue par de nombreux vendeurs (Nvidia, Ati, Apple, etc.) et vous pouvez obtenir un SDK immédiatement.


Le code source frontal de CG est disponible sur développeur.nvidia.com/Object/cg_compiler_code.html < / a> Le code est mis à disposition spécifiquement pour créer un dos pour le compilateur. Cependant, je préfère les solutions existantes telles que OPENCL.



7
votes

Votre meilleur pari est probablement opencl. Je sais que cela a principalement été utilisé comme un moyen d'exécuter du code sur GPU, mais les noyaux OPENCL peuvent également être compilés et exécutés sur des processeurs. Opencl est essentiellement C avec quelques restrictions:

  1. aucun pointeurs de fonction li>
  2. pas de récursion li> ol>

    et un tas d'ajouts. En particulier Types de vecteurs: P>

    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
    


5 commentaires

Puis-je toujours relier Opencl Libs à une application C et remettre un ensemble de vecteurs?


Venir à y penser, il n'a pas besoin de pouvoir lier, j'ai juste besoin de pouvoir transmettre certaines données :-)


Fondamentalement, vous compilez un noyau de calcul OpenCL qui a une fonction C comme point d'entrée, puis vous exécutez Dis OpenCl pour exécuter le noyau à l'aide des paramètres que vous spécifiez, ce qui pourrait être des vecteurs, des ensembles de données ou même des textures.


Cela semble être la meilleure solution pour le problème que j'ai à portée de main, merci.


Afaiu Opencl nécessite des pilotes sur l'hôte - comment une application (disait-elle, un jeu) qui utilise OpenCL être expédiée sur les 3 principales plates-formes de bureau?



1
votes

0 commentaires

6
votes

Donc récemment Intel publié ISPC , ce que je cherchais exactement lors de cette question. C'est une langue pouvant être liée au code C normal C, de modèle d'exécution implicite et de prise en charge de toutes les fonctionnalités mentionnées dans le poste de départ (opérateurs Swizzle, branchement, structures de données, vectorielles, shader comme) et compile pour SSE2, SSE4, AVX, AVX2 et Xeon Phi Vector Instructions.


0 commentaires

0
votes

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


0 commentaires