문제

지난 몇 년 동안 저는 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 문).
도움이 되었습니까?

해결책 3

최근에 인텔이 출시되었습니다 ISPC 이 질문을 할 때 바로 내가 찾고 있던 것입니다. 일반적인 C 코드와 연결하고, 보유하고 및 암시 적 실행 모델을 링크 할 수 있으며, 시작 게시물에 언급 된 모든 기능 (Swizzle Operator, Branching, Data Structs, Vector Ops, Shader) 및 SSE2, SSE4, 컴파일을 지원하는 언어입니다. AVX, AVX2 및 Xeon Phi 벡터 지침.

다른 팁

가장 좋은 방법은 아마도 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를 얻게 됩니다.

여기 모든 확장 기능이 포함된 빠른 참조/치트 시트입니다.

실제로 언어 자체는 아니지만 모노를위한 도서관이 있습니다 (모노) 벡터를 귀하에게 노출시키고 가능할 때마다 SSE로 작업을 최적화합니다.

언어에 내장되지 않고 C ++의 라이브러리이지만 고유 변수가 선언되면 꽤 보이지 않습니다.

현재 가장 좋은 솔루션은 Nvidia가 발표 한 오픈 소스 CG 프론트 엔드에 대한 백엔드를 만들어 직접 수행하는 것입니다. 그러나 이전에 완료된 경우 궁금한 노력을 저축하고 싶습니다. 바람직하게는 바로 사용하기 시작했습니다.

D 프로그래밍 언어는 또한 Mono.simd와 비슷한 방식으로 Simd에 대한 액세스를 제공합니다.

그것은 당신이 찾고있는 Fortran 일 것입니다. 메모리가 제공되는 경우 오픈 소스 컴파일러 (G95, Gfortran)가 하드웨어에서 구현 된 경우 SSE를 활용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top