Programming languages SIMD编程语言

Programming languages SIMD编程语言,programming-languages,sse,simd,ispc,Programming Languages,Sse,Simd,Ispc,在过去的几年里,我一直在做很多SIMD编程,大部分时间我都依赖于编译器的内部函数(比如用于SSE编程的函数)或编程汇编来获得真正漂亮的东西。然而,到目前为止,我几乎找不到任何内置支持SIMD的编程语言 很明显,现在有一些着色器语言,比如HLSL、Cg和GLSL,它们对这类东西有原生的支持。然而,我正在寻找一种至少能够编译到SSE而不需要自动矢量化,但内置支持向量操作的语言。这种语言存在吗 这是一个Cg着色器的示例(部分),它可以产生聚光灯,就语法而言,这可能是最接近我想要的 float4 pix

在过去的几年里,我一直在做很多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操作符
  • 矢量运算(点、交叉、归一化、饱和、反射等)
  • 支持自定义数据类型(结构)
  • 动态分支会很好(对于循环、if语句)

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

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

目前最好的解决方案是为Nvidia发布的开源Cg前端创建一个后端,这样做是我自己的事,但我想省力一点,所以我很好奇以前是否做过。最好我马上开始使用它。

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


    是一个带有所有扩展的快速引用/ CabATEL。

    < P>是C++的库,而不是内置到语言中,但一旦变量被声明,就很难被看见。

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

    D编程语言也以与Mono.SIMD类似的方式提供对SIMD的访问这些FORTRAN实现仍然使用自动矢量化,与大多数C++编译器支持相同。我遇到的问题是,很难预测哪些代码将被矢量化,哪些代码不会。现在我不知道FORTRAN编译器中的状态,因为我的背景是C++,所以我想我更喜欢一个高层次的着色器,它能让我对最终的输出有更多的控制。看起来比C++的本质要好得多。然而,这个解决方案大体上是等效的,而不是我想要的。(我在寻找使用SIMD内置而不是固定语言设计的实际语言)。然而,在做基于.Net的解决方案时,这绝对是需要记住的。我仍然可以将OpenCL LIB链接到C应用程序并将一组向量传递给它吗?仔细想想,它不需要能够链接,我只需要能够传递一些数据:-)基本上,你编译一个以C函数为入口点的OpenCL计算内核,然后运行告诉OpenCL使用你指定的参数运行内核,这些参数可以是向量、数据集,甚至纹理。这似乎是解决我手头问题的最佳解决方案,谢谢。AFAIU OpenCL需要主机上的驱动程序——一个应用程序如何运行(比如说,一款使用OpenCL的游戏)将在三大桌面平台上发布?Cg不是开源的,它是Nvidia的专利。创建一个为CPU生成SIMD代码的后端将需要大量的工作。正如Louis所回答的,你应该认真检查OpenCL。你可以用基于C的语言编写处理内核(非常类似于Cg和GLSL)并在GPU或CPU上运行(它将为您生成SIMD代码)。OpenCL是跨平台的,受到许多供应商(Nvidia、ATI、Apple等)的支持你可以马上得到一个SDK。Cg前端源代码可以在网站上找到,代码是专门为编译器创建后端的。但是,我更喜欢现有的解决方案,比如OpenCL。