2009-09-13 6 views
12

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)

Répondre

6

Alors récemment Intel publié ISPC qui est exactement ce que je cherchais en posant cette question. C'est un langage qui peut être lié au code C normal, au modèle d'exécution implicite et implicite, et supporte toutes les fonctionnalités mentionnées dans le post de départ (opérateurs de swizzle, branches, structures de données, opérations vectorielles, shader like) et compile pour SSE2, SSE4, Instructions vectorielles AVX, AVX2 et Xeon Phi.

0

Ce serait Fortran que vous cherchiez. Si la mémoire sert même les compilateurs open-source (g95, gfortran) profitera de SSE s'il est implémenté sur votre matériel.

+2

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. –

6

Ce n'est pas vraiment la langue elle-même, mais il y a une bibliothèque Mono (Mono.Simd) qui expose les vecteurs de vous et d'optimiser les opérations sur eux dans SSE lorsque cela est possible:

+0

Cette solution est belle; semble beaucoup mieux que les intrinsèques 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é au lieu de boulonné). Cependant, c'est certainement quelque chose à retenir lorsque vous faites une solution basée sur .Net. –

0

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

+0

Cg n'est pas open source, c'est la propriété de Nvidia. Ce serait une énorme quantité de travail pour créer un back-end qui aurait généré du code SIMD pour un CPU. Alors que Louis répond, vous devriez vérifier sérieusement OpenCL. Vous pouvez écrire des noyaux de traitement dans un langage basé sur C (très similaire à Cg et GLSL) et l'exécuter sur le GPU ou le CPU (où il va générer du code SIMD pour vous). OpenCL est multi-plateforme, supporté par de nombreux fournisseurs (Nvidia, ATI, Apple, etc) et vous pouvez obtenir un SDK tout de suite. – gavinb

+0

Le code source frontal Cg est disponible sur http://developer.nvidia.com/object/cg_compiler_code.html Le code est disponible spécifiquement pour créer un back-end pour le compilateur. Cependant, je préfère les solutions existantes telles que OpenCL. –

7

Votre meilleur pari est probablement OpenCL. Je sais qu'il a surtout été hype comme un moyen d'exécuter du code sur les 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 pointeur de fonction
  2. Pas de récursion

et un tas d'ajouts. Dans les types de vecteur particulier:

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 

En grande mise en garde est que le code doit être proprement sperable, OpenCL ne peut pas appeler à des bibliothèques arbitraires, etc. Mais si vos noyaux de calcul sont raisonnablement indépendants alors vous essentiellement obtenir un vecteur amélioré C où vous n'avez pas besoin d'utiliser intrinsèques.

Here est une référence rapide/cheatsheet avec toutes les extensions.

+0

Puis-je encore lier des bibliothèques OpenCL à une application C et lui transmettre un ensemble de vecteurs? –

+0

En y réfléchissant, il n'a pas besoin d'être capable de lier, j'ai juste besoin de pouvoir lui transmettre des données :-) –

+1

Fondamentalement, vous compilez un noyau de calcul OpenCL qui a une fonction C comme point d'entrée , alors vous exécutez dire à OpenCL d'exécuter le noyau en utilisant les paramètres que vous spécifiez, qui peuvent être des vecteurs, des ensembles de données, ou même des textures. –

1

C'est une bibliothèque pour C++, plutôt que intégrée dans le langage, mais Eigen est assez invisible une fois que vos variables sont déclarées.

0

Le langage de programmation D permet également d'accéder à SIMD de la même manière que Mono.SIMD.

Questions connexes