11

在过去的几年里,我做了很多 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);
}

在这种语言中真正必须的东西是:

  • 内置调酒运算符
  • 矢量操作(点、交叉、归一化、饱和、反射等)
  • 支持自定义数据类型(结构)
  • 动态分支会很好(for循环,if语句)
4

7 回答 7

7

您最好的选择可能是 OpenCL。我知道它主要被宣传为在 GPU 上运行代码的一种方式,但 OpenCL 内核也可以在 CPU 上编译和运行。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,你不需要使用内在函数.

是包含所有扩展的快速参考/备忘单。

于 2009-09-21T14:11:07.470 回答
6

它不是真正的语言本身,但有一个 Mono ( Mono.Simd ) 库,它将向您公开向量并尽可能将它们的操作优化到 SSE 中:

于 2009-09-13T13:44:56.700 回答
6

所以最近英特尔发布了ISPC,这正是我在问这个问题时所寻找的。它是一种可以与普通 C 代码链接的语言,具有隐式执行模型,并支持开始文章中提到的所有特性(swizzle 运算符、分支、数据结构、向量操作、着色器等),并为 SSE2、SSE4 编译, AVX、AVX2 和 Xeon Phi 矢量指令。

于 2012-03-28T21:08:44.400 回答
2

它是 C++ 的库,而不是内置于语言中,但是一旦声明了变量, Eigen就非常不可见。

于 2012-03-27T16:16:53.143 回答
0

D 编程语言还以与 Mono.SIMD 类似的方式提供对 SIMD 的访问。

于 2012-10-02T21:43:36.647 回答
0

那将是您正在寻找的 Fortran。如果内存服务于开源编译器(g95、gfortran),如果它在您的硬件上实现,它也会利用 SSE。

于 2009-09-13T13:30:45.370 回答
0

目前最好的解决方案是通过为 Nvidia 发布的开源 Cg 前端创建一个后端来自己做,但我想节省自己的努力,所以我很好奇以前是否做过。最好我会立即开始使用它。

于 2009-09-17T12:40:54.783 回答