SIMD языки программирования - PullRequest
12 голосов
/ 13 сентября 2009

В последние пару лет я много занимался программированием SIMD, и большую часть времени я полагался на встроенные функции компилятора (например, для программирования SSE) или на сборку программирования, чтобы добраться до действительно изящные вещи. Однако до сих пор я едва мог найти какой-либо язык программирования со встроенной поддержкой SIMD.

Теперь, очевидно, есть шейдерные языки, такие как HLSL, Cg и GLSL, которые имеют встроенную поддержку для такого рода вещей, однако я ищу что-то, что могло бы по крайней мере компилироваться в SSE без автовекторизации, но со встроенной поддержкой для векторных операций. Существует ли такой язык?

Это пример (часть) Cg-шейдера, который делает прожектор, и с точки зрения синтаксиса это, вероятно, наиболее близко к тому, что я ищу.

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

Материал, который был бы действительно необходим на этом языке:

  • Встроенные операторы Swizzle
  • Векторные операции (точка, крест, нормализация, насыщение, отражение и так далее)
  • Поддержка пользовательских типов данных (структур)
  • Динамическое ветвление было бы неплохо (для циклов, если операторы)

Ответы [ 7 ]

7 голосов
/ 21 сентября 2009

Ваша лучшая ставка, вероятно, OpenCL. Я знаю, что в основном это был раскрученный способ запуска кода на графических процессорах, но ядра OpenCL также можно компилировать и запускать на процессорах. OpenCL - это в основном C с несколькими ограничениями:

  1. Нет указателей на функции
  2. Без рекурсии

и куча дополнений. В частности, векторные типы:

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

С большой оговоркой следует, что код должен быть чисто работоспособным, OpenCL не может обращаться к произвольным библиотекам и т. Д. Но если ваши вычислительные ядра достаточно независимы, то вы в основном получаете расширенный вектор C, где вам не нужно использовать встроенные функции.

Здесь - это краткий справочник / шпаргалка со всеми расширениями.

6 голосов
/ 13 сентября 2009

Это на самом деле не сам язык, но есть библиотека для Mono ( Mono.Simd ), которая предоставит вам векторы и оптимизирует операции над ними в SSE, когда это возможно:

5 голосов
/ 29 марта 2012

Итак, недавно Intel выпустила ISPC , и это именно то, что я искал, задавая этот вопрос. Это язык, который может связываться с обычным кодом C, имеет и неявную модель выполнения, а также поддержку всех функций, упомянутых в начальном посте (операторы Swizzle, ветвление, структуры данных, векторные операции, шейдеры) и компилируется для SSE2, SSE4 Векторные инструкции AVX, AVX2 и Xeon Phi.

1 голос
/ 27 марта 2012

Это библиотека для C ++, а не встроенная в язык, но Eigen довольно невидима после объявления ваших переменных.

0 голосов
/ 03 октября 2012

Язык программирования D также обеспечивает доступ к SIMD аналогично Mono.SIMD.

0 голосов
/ 17 сентября 2009

В настоящее время лучшее решение - это сделать это самостоятельно, создав бэк-энд для Cg-интерфейса с открытым исходным кодом, который выпустил Nvidia, но я бы хотел сэкономить усилия, поэтому мне любопытно, было ли это сделано раньше. Желательно, чтобы я сразу начал его использовать.

0 голосов
/ 13 сентября 2009

Это будет Фортран, который вы ищете. Если память обслуживает, даже компиляторы с открытым исходным кодом (g95, gfortran) воспользуются SSE, если она реализована на вашем оборудовании.

...