Pergunta

No último par de anos, eu venho fazendo um monte de programação SIMD e na maioria das vezes eu estive contando com funções intrínsecas do compilador (como os de programação SSE) ou sobre a programação de montagem para chegar as coisas realmente bacana. No entanto, até agora eu mal sido capaz de encontrar qualquer linguagem de programação com suporte embutido para SIMD.

Agora, obviamente, existem as línguas de sombreamento como HLSL, Cg e GLSL que têm suporte nativo para este tipo de coisas no entanto, eu estou procurando algo que é capaz de, pelo menos compilação para SSE sem autovectorization mas com suporte embutido para operações de vetor. Será que as houver linguagem um?

Este é um exemplo de (parte de) um shader Cg que faz um holofote e em termos de sintaxe este é provavelmente o mais próximo do que eu estou procurando.

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

Coisas que seria um verdadeiro must nesta língua é:

  • construído em operadores swizzle
  • Operações de vetor (ponto, cruz, normalize, saturar, refletir et cetera)
  • O suporte para tipos de dados personalizados (estruturas)
  • Dinâmica ramificação seria bom (para loops, if)
Foi útil?

Solução 3

Então, recentemente a Intel lançou ISPC que é exatamente o que eu estava procurando quando fazendo esta pergunta. É uma linguagem que pode vincular com código normal C, tem e modelo de execução implícita, e suporte para todas as características mencionadas no post de partida (operadores de swizzle, ramificação, estruturas de dados, ops vetor, shader como) e compila para SSE2, SSE4, AVX, AVX2, e Xeon Phi instruções vetoriais.

Outras dicas

Sua melhor aposta é provavelmente OpenCL. Eu sei que tem sido principalmente sensacionalistas como uma maneira de executar código no GPUs, mas kernels OpenCL também pode ser compilado e executado em CPUs. OpenCL é basicamente C com algumas restrições:

  1. Não ponteiros de função
  2. No recursão

e um monte de adições. Em determinados tipos vetor:

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

Em grande limitação é que o código tem que ser limpa sperable, OpenCL não pode chamar a bibliotecas arbitrárias, etc. Mas se seus kernels de computação são razoavelmente independente, então você basicamente obter um vector melhorado C, onde você não precisa para intrínsecos de uso.

Aqui é uma referência rápida / cheatsheet com todos as extensões.

Não é realmente a própria língua, mas há uma biblioteca para Mono ( Mono.Simd ) que irá expor os vetores para você e otimizar as operações sobre eles em SSE sempre que possível:

É uma biblioteca para C ++, em vez de construído dentro da linguagem, mas Eigen é bastante invisível uma vez que suas variáveis são declarados.

Atualmente, a melhor solução é fazer isso sozinho, criando um back-end para o open-source Cg frontend que a Nvidia lançado, mas eu gostaria de me salvar o esforço, então estou curioso para saber se isso já foi feito antes. De preferência, eu ia começar a usá-lo imediatamente.

A linguagem de programação D também fornece acesso a SIMD de forma semelhante do que Mono.SIMD.

Isso seria Fortran que você está procurando. Se a memória serve até mesmo os compiladores de código aberto (G95, gfortran) vai aproveitar SSE se ele é implementado em seu hardware.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top