在过去的几年里,我一直在做很多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 …Run Code Online (Sandbox Code Playgroud) 我在内核中找不到很多SIMD指令(如SSE/AVX)(除了一个用于加速RAID6奇偶校验计算的地方).
Q1)是否有任何特定原因或仅缺少用例?
Q2)如果我想使用SIMD指令,比如设备驱动程序,今天需要做什么?
Q3)将像ISPC这样的框架纳入内核(仅用于实验)有多难?
我有一个简单的项目。它包含两个文件:
main.c
kernel.ispc
Run Code Online (Sandbox Code Playgroud)
(ispc 文件是https://ispc.github.io/ 的来源)
要手动编译文件,我将使用:
ispc --target=sse2 kernel.ispc -o kernel.o
gcc -c main.c -o main.o
gcc main.o kernel.o -o my_program
Run Code Online (Sandbox Code Playgroud)
所以对于我的 cmake 文件,它看起来像
project(my_program)
add_executable(my_program main.c)
Run Code Online (Sandbox Code Playgroud)
但当然它不会链接,因为它缺少 kernel.o 中的符号
所以问题是:如何让 cmakekernel.ispc使用ispc编译器进行编译,以及如何让 cmake 将其链接到my_program?