代码之家  ›  专栏  ›  技术社区  ›  Jasper Bekkers

SIMD编程语言

  •  12
  • Jasper Bekkers  · 技术社区  · 15 年前

    在过去的几年里,我一直在做大量的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);
    }
    

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

    • 内置水枪操作员
    • 矢量运算(点、交叉、标准化、饱和、反射等)
    • 支持自定义数据类型(结构)
    • 动态分支将是很好的(对于循环、if语句)
    7 回复  |  直到 15 年前
        1
  •  7
  •   Louis Gerbarg    15 年前

    你最好的选择可能是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,在这里你不需要使用intrinsic。

    Here 是包含所有扩展的快速参考/作弊表。

        2
  •  6
  •   viraptor    15 年前

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

        3
  •  6
  •   elmattic    11 年前

    最近英特尔发布了 ISPC 这正是我在问这个问题时想要的。它是一种可以与普通C代码链接的语言,具有隐式执行模型,并支持start post中提到的所有功能(swizzle操作符、分支、数据结构、向量操作、shader-like),并为SSE2、SSE4、AVX、AVX2和Xeon phi向量指令编译。

        4
  •  1
  •   Jim Hunziker    12 年前

    它是C++的一个库,而不是构建在语言中,但是 Eigen 一旦变量被声明,就相当不可见。

        5
  •  0
  •   Jasper Bekkers    15 年前

    目前最好的解决方案是通过为Nvidia发布的开源CG前端创建一个后端来实现这一点,但是我想节省自己的精力,所以我很好奇以前是否做过。最好我马上开始用。

        6
  •  0
  •   rodrigob    12 年前

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

        7
  •  0
  •   user229044    12 年前

    那就是你要找的要塞。如果内存服务于开放源码编译器(G95、Gfortran),那么如果在硬件上实现了SSE,那么它将利用SSE。

    推荐文章