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

SIMD编程语言

  •  11
  • Jasper Bekkers  · 技术社区  · 16 年前

    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语句)
    8 回复  |  直到 7 年前
        1
  •  7
  •   Louis Gerbarg    16 年前

    最近Intel发布 ISPC

        2
  •  6
  •   viraptor    16 年前

    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,在那里你不需要使用内部函数。

    Here

        3
  •  6
  •   elmattic    13 年前

    Mono.Simd )这将向您展示矢量,并尽可能优化它们在SSE中的操作:

        4
  •  1
  •   Jim Hunziker    14 年前
        5
  •  0
  •   Jasper Bekkers    16 年前

        6
  •  0
  •   rodrigob    13 年前

        7
  •  0
  •   user229044    13 年前