Подтвердить что ты не робот

Языки программирования SIMD

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

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

Это пример (часть) 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
  • Операции с вектором (точка, крест, нормализация, насыщение, отражение и т.д.)
  • Поддержка пользовательских типов данных (структур)
  • Динамическое разветвление было бы приятным (для циклов, если инструкции)
4b9b3361

Ответ 1

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

Ответ 2

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

  • Нет указателей на функции
  • Нет рекурсии

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

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, где вам не нужно для использования встроенных функций.

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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