Pregunta

En los últimos años, he estado haciendo mucha programación SIMD y la mayoría de las veces he estado confiando en funciones intrínsecas del compilador (como las de programación SSE) o en el ensamblaje de programación para llegar a Las cosas realmente ingeniosas. Sin embargo, hasta ahora apenas he podido encontrar ningún lenguaje de programación con soporte incorporado para SIMD.

Ahora, obviamente, hay lenguajes de sombreado como HLSL, Cg y GLSL que tienen soporte nativo para este tipo de cosas, sin embargo, estoy buscando algo que al menos pueda compilar a SSE sin autovectorización pero con soporte incorporado para operaciones vectoriales. ¿Existe tal lenguaje?

Este es un ejemplo de (parte de) un sombreador de Cg que destaca y, en términos de sintaxis, esto es probablemente lo más parecido a lo que estoy buscando.

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

Las cosas que serían imprescindibles en este idioma son:

  • Construido en operadores de swizzle
  • Operaciones vectoriales (punto, cruz, normalización, saturación, reflexión, etc.)
  • Soporte para tipos de datos personalizados (estructuras)
  • La ramificación dinámica sería buena (para bucles, si las declaraciones)
¿Fue útil?

Solución 3

Tan recientemente Intel lanzó ISPC , que es exactamente lo que estaba buscando al hacer esta pregunta. Es un lenguaje que puede vincularse con el código C normal, tiene un modelo de ejecución implícito y es compatible con todas las características mencionadas en la publicación de inicio (operadores de swizzle, ramificación, estructuras de datos, operaciones vectoriales, como sombreador) y compila para SSE2, SSE4, Instrucciones de vector de AVX, AVX2 y Xeon Phi.

Otros consejos

Su mejor apuesta es probablemente OpenCL. Sé que se ha promocionado principalmente como una forma de ejecutar código en GPU, pero los núcleos de OpenCL también se pueden compilar y ejecutar en CPU. OpenCL es básicamente C con algunas restricciones:

  1. Punteros sin función
  2. Sin recursividad

y un montón de adiciones. En particular tipos de vectores:

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

Una gran advertencia es que el código tiene que ser limpiamente esperable, OpenCL no puede llamar a bibliotecas arbitrarias, etc. Pero si sus núcleos de cómputo son razonablemente independientes, entonces básicamente obtendrá un vector mejorado C donde no necesita usar intrínsecos.

Aquí es una referencia rápida / hoja de referencia con todos las extensiones.

No es realmente el lenguaje en sí, pero hay una biblioteca para Mono ( Mono.Simd ) que expondrá los vectores a usted y optimizará las operaciones en SSE siempre que sea posible:

Es una biblioteca para C ++, en lugar de estar integrada en el lenguaje, pero Eigen es bastante invisible una vez que sus variables son declarados.

Actualmente, la mejor solución es hacerlo yo mismo creando un back-end para la interfaz Cg de código abierto que lanzó Nvidia, pero me gustaría ahorrarme el esfuerzo, así que tengo curiosidad por saber si se ha hecho antes. Preferiblemente comenzaría a usarlo de inmediato.

El lenguaje de programación D también proporciona acceso a SIMD de forma similar a Mono.SIMD.

Ese sería Fortran que estás buscando. Si la memoria sirve incluso a los compiladores de código abierto (g95, gfortran) aprovecharán SSE si se implementa en su hardware.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top