Frage

In den letzten paar Jahren habe ich eine Menge von SIMD-Programmierung getan und die meisten der Zeit, die ich verlassen habe auf Compiler systeminterne Funktionen (wie die, die für SSE-Programmierung) oder auf die Programmierung Montage zu erhalten, die wirklich nette Sachen. Aber bisher habe ich kaum in der Lage gewesen, mit integrierten Unterstützung für SIMD jeden Programmiersprache zu finden.

Jetzt offensichtlich gibt es die Shader-Sprachen wie HLSL, Cg und GLSL, das jedoch für diese Art von Sachen native Unterstützung hat, ich bin für etwas, das zumindest in der Lage ist, ohne autovectorization zu SSE zu kompilieren, aber mit dem integrierten Unterstützung für Vektoroperationen. Gibt es eine solche Sprache existieren?

Diese

ist ein Beispiel für (einen Teil) eines Cg-Shader, die ein Schlaglicht tut und in Bezug auf die Syntax ist dies wahrscheinlich die am nächsten zu dem, was ich suche.

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, die ein echtes Muss in dieser Sprache wären, ist:

  • gebaut swizzle Operatoren
  • Vektoroperationen (dot, Kreuz, zu normalisieren, sättigen, reflektieren und so weiter)
  • Unterstützung für benutzerdefinierte Datentypen (structs)
  • würde dynamische Verzweigung schön sein (für Schleifen, if-Anweisungen)
War es hilfreich?

Lösung 3

So vor kurzem Intel veröffentlicht ISPC das ist genau das, was ich suchte, wenn diese Frage zu stellen. Es ist eine Sprache, die mit normalen C-Code verknüpfen kann, hat und implizites Ausführungsmodell und Unterstützung für alle Funktionen im Start Beitrag erwähnt (swizzle Operatoren, Verzweigungen, Daten structs, Vektor-ops, Shader usw.) und erstellt für SSE2, SSE4, AVX, AVX2 und Xeon Phi Vektorbefehle.

Andere Tipps

Ihre beste Wette ist wahrscheinlich OpenCL. Ich weiß, es hat sich vor allem als eine Möglichkeit zu laufen Code auf GPUs, aber OpenCL-Kernel kann auch kompiliert werden und laufen auf CPUs gehypt worden. OpenCL ist im Grunde C mit einigen Einschränkungen:

  1. Keine Funktionszeiger
  2. Keine Rekursion

, und eine Reihe von Ergänzungen. Insbesondere Vektortypen:

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

Ein großer Nachteil ist, dass der Code sauber sperable sein muss, kann OpenCL rufen nicht auf beliebige Bibliotheken aus, etc. Aber wenn Sie Ihre Rechenkerne maßen unabhängig sind dann erhalten Sie im Grunde einen Vektor verbesserte C, wo Sie nicht brauchen, verwenden intrinsics.

Hier ist eine schnelle Referenz / Spickzettel mit allen die Erweiterungen.

Es ist nicht wirklich die Sprache selbst, aber es ist eine Bibliothek für Mono ( Mono.Simd ), die die Vektoren Sie entlarven und die Operationen auf sie in SSE optimieren, wann immer möglich:

Es ist eine Bibliothek für C ++, anstatt in die Sprache gebaut, aber Eigen ist ziemlich unsichtbar, sobald Ihre Variablen deklariert werden.

Zur Zeit ist die beste Lösung, es selbst zu tun, indem Sie ein Back-End für den Open-Source-Cg-Frontend erstellen, die Nvidia veröffentlicht, aber ich mag mir die Mühe sparen, damit ich bin gespannt, ob es vorher getan worden ist. Vorzugsweise würde ich sofort zu verwenden beginnen.

Die Programmiersprache D bietet auch Zugriff auf SIMD in ähnlicher Weise als Mono.SIMD.

Das wäre Fortran, die Sie suchen. Wenn der Speicher dient auch die Open-Source-Compiler (g95, gfortran) werden die Vorteile von SSE nehmen, wenn es auf Ihrer Hardware implementiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top