2009-09-13 4 views
12

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)

risposta

6

Di recente Intel ha rilasciato ISPC che è esattamente quello che stavo cercando quando ho fatto questa domanda. È un linguaggio che può collegarsi con il normale codice C, ha e modello di esecuzione implicito e supporto per tutte le funzionalità menzionate nel post di partenza (operatori swizzle, ramificazioni, strutture dati, operazioni vettoriali, shader come) e compila per SSE2, SSE4, Istruzioni vettoriali AVX, AVX2 e Xeon Phi.

0

Questo sarebbe Fortran che stai cercando. Se la memoria serve anche i compilatori open-source (g95, gfortran) si avvantaggerà di SSE se è implementato sul tuo hardware.

+2

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

6

Non è davvero il linguaggio stesso, ma v'è una libreria per Mono (Mono.Simd) che esporrà i vettori a voi e ottimizzare le operazioni su di essi in SSE quando possibile:

+0

Questa soluzione sembra carina; sembra molto meglio degli intrinsechi C++. Comunque la soluzione è più o meno equivalente e non è quello che sto cercando. (Stavo cercando linguaggi reali progettati con SIMD integrato invece che avvitati). Tuttavia, è sicuramente qualcosa da ricordare quando si fa una soluzione basata su .Net. –

0

Attualmente la soluzione migliore è quella di fare me stesso creando un back-end per il frontend Cg open-source che Nvidia ha rilasciato, ma mi piacerebbe risparmiarmi lo sforzo quindi sono curioso di sapere se è stato fatto prima. Preferibilmente inizierei ad usarlo subito.

+0

Cg non è open source, è proprietario di Nvidia. Sarebbe un'enorme quantità di lavoro creare un back-end che generasse il codice SIMD per una CPU. Come risponde Louis, dovresti controllare seriamente OpenCL. Puoi scrivere i kernel di elaborazione in un linguaggio basato su C (molto simile a Cg e GLSL) ed eseguirlo sulla GPU o sulla CPU (dove genererà il codice SIMD per te). OpenCL è multipiattaforma, supportata da molti fornitori (Nvidia, ATI, Apple, ecc.) E puoi ottenere subito un SDK. – gavinb

+0

Il codice sorgente front-end Cg è disponibile all'indirizzo http://developer.nvidia.com/object/cg_compiler_code.html Il codice è reso disponibile specificamente per la creazione di un back-end per il compilatore. Tuttavia, preferisco soluzioni esistenti come OpenCL. –

7

La tua migliore scommessa è probabilmente OpenCL. So che è stato per lo più pubblicizzato come un modo per eseguire codice su GPU, ma i kernel OpenCL possono anche essere compilati ed eseguiti su CPU. OpenCL è fondamentalmente C con alcune restrizioni:

  1. Nessun puntatori a funzione
  2. No ricorsione

e un mazzo di aggiunte. In particolari tipi di vettore:

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 

su grandi avvertimento è che il codice deve essere pulita sperable, OpenCL non può chiamare fuori per le biblioteche arbitrarie, ecc Ma se i vostri kernel di calcolo sono ragionevolmente indipendenti, allora è fondamentalmente ottenere un vettore C migliorato in cui non è necessario utilizzare intrinseche.

Here è un riferimento rapido/cheatsheet con tutte le estensioni.

+0

Posso ancora collegare librerie OpenCL ad un'applicazione C e consegnarle una serie di vettori? –

+0

Per non pensarci, non è necessario essere in grado di collegarmi, ho solo bisogno di essere in grado di passarlo alcuni dati :-) –

+1

Fondamentalmente, si compila un kernel di calcolo OpenCL che ha una funzione C come punto di ingresso , quindi esegui dire a OpenCL di eseguire il kernel usando i parametri specificati, che potrebbero essere vettori, set di dati o persino trame. –

1

È una libreria per C++, piuttosto che integrata nella lingua, ma Eigen è piuttosto invisibile una volta dichiarate le variabili.

0

Il linguaggio di programmazione D consente anche l'accesso a SIMD in modo simile a Mono.SIMD.