GPU를 활용하는 일은 모든 개발자에게 열려있는 길이여야 합니다.
하지만 DirectX를 직접적으로 활용해야만 하는
MS의 GPGPU 플랫폼인 DirectCompute는 그렇지가 않습니다.

그래픽카드라는게 원래 특수한 목적성을 가지고 등장한 장치이기 때문에,
이를 활용하는 사람들 또한 특정 영역에 국한되어 있는게 현실입니다.
'이제부터 GPGPU 를 적극 활용합시다!' 라고 생각을 하더라도, 
실제로 그것을 활용하기 위한 진입 장벽은 굉장히 높을 수 밖에 없습니다.

그러면 어떻게 해야만 이 장벽을 조금이라도 낮출 수 있을까요?
엔비디아의 CUDA 를 보면, 힌트가 있습니다.
하지만 몰라도 상관없습니다.^^
C++ 파일 내에서 컴파일러에 의해서 자동적으로 처리가 될 수 있으면 가장 좋지 않을까요?
순수 C++ 의 기능만 사용해서 컴파일러가 자동적으로 처리해 준다면,
개발자는 DirectX와 ComputeShader 에서 해방될 수 있을 것입니다.
그것이 바로 C++ AMP 가 등장하는 배경
입니다.
C++ AMP는 다음 버전의 VisualStudio 에 탑재 되어져서 등장할 예정이라고 합니다.


어떤 함수가 아래와 같이 있습니다.
void Func( ... )
{
    코드
}

위의 함수는 결국 컴파일러에 의해서 CPU 와 관련한 명령어를 생성하게 됩니다.
이를 AMP 적으로 확장하면 정확히 아래와 같이 구성됩니다.
void Func( ... ) restrict( cpu )
{
   코드
}

restrict 이라는 키워드를 함수에 적용함으로써 간단히 이를 구현합니다.
눈치가 좀 빠르신 분들이라면
'저 cpu를 gpu 로만 변경하면, gpu 로 컴파일 되어지는 것인가?' 라고 생각이 드실 겁니다.
네. 맞습니다.
그것이 바로 C++ AMP 가 DirectCompute 를 구현하는 방법입니다.
정확히는 아래와 같습니다.
void Func( ... ) restrict( direct3d )
{
   코드
}
'direct3d' 가 바로 'gpu' 를 의미합니다.
현재 이 옵션용 예약어는 확정적인 것은 아닙니다.
'direct3d' 가 확정될 수도 있고, 그렇지 않을 수도 있습니다.
아직 C++ AMP가 출시되지 않아서 유동적인 부분이 있습니다.
그 점 주의해서 읽어주시기 바랍니다.^^

다음 버전의 Visual C++ 부터는 
함수마다 저렇게 restrict 한정자에 컴파일 옵션을 지정해주어야 합니다.

물론 지정을 하지 않았을 때는, 디폴트로 restrict( cpu ) 로 자동 처리할 것입니다.

그러면 한 함수 내에서 CPU와 GPU를 활용해야 하는 경우는 어떻게 해야할까요?
void Func( ... ) restrict( direct3d, cpu )
{
   GPU를 사용하는 코드
   CPU를 사용하는 코드
}

위와 같이 혼합해서 사용하는 것도 가능합니다.
또한 오버로드와 관련한 이슈도 문제 없이 처리될 것입니다.
void Func( ... );
void Func( ... ) restrict( direct3d );

간단히 위와 같이 restrict 만으로 GPU를 사용하는 것이 완전히 된다면 얼마나 좋겠습니까만,
restrict( direct3d ) 로 정의되어지는 함수들은 그에 상응하는 규칙으로 코딩 작업을
해야만 합니다.
이것이 사실 그렇게 쉬운 개념만으로 이해할 수 있는 것은 아닙니다.
하지만 DirectCompute를 직접 제어하는 것보다는 쉽습니다.

다음 시간부터 C++ AMP 로 프로그래밍 하는 개념에 대해서 살펴보겠습니다.^^

댓글을 달아 주세요

  1. xanhous 2011.11.30 12:29  댓글주소  수정/삭제  댓글쓰기

    1. 만약 비디오카드가 성능이 안좋아서
    void Func( ... ) restrict( cpu )
    로 하면 자동으로 SIMD를 사용하나요?
    컴파일러에서 SIMD를 지원하면 어디까지 지원하나요?
    (MMX, SSE2,SSE3, SSE4, SSE4.1, AVX 등)

    2. OpenMP 같은 병렬 프로세싱은 컴파일러에서 처리하나요?
    아니면 코딩해줘야 하나요?

    • 조진현 2011.11.30 20:02 신고  댓글주소  수정/삭제

      제가 질문하신 의도를 잘 파악했는지 잘 모르겠으니
      답변에 모호한 부분이 있으면,
      다시 피드백 주시기 바랍니다.^^

      1. restrict( cpu ) 를 명시한다고 해서,
      컴파일러가 자동적으로 이 명시에 대한 특별한 최적화를 하지 않습니다.
      이것은 SIMD 명령어 세트와 무관합니다.
      SSE4 같은 최신 명령어 세트를 사용하고 싶다면,
      직접 해주셔야 합니다..^^

      2. OpenMP도 결국 개발자들이 직접 코딩을 해주어야 합니다.
      컴파일러가 자동적으로 이들을 병렬적으로 처리하도록 명령어를 생성하지 않습니다.^^
      병렬로 처리한다고 해서 반드시 빠른 것은 아닙니다.
      적절한 상황에 사용해야 효과가 크니깐요..^^

  2. xanhous 2011.12.01 09:25  댓글주소  수정/삭제  댓글쓰기

    네..답변 고맙습니다 ^^;

    나와봐야알겠지만 성급한 마음에 두서없는 질문을 드렸습니다.

    • 조진현 2011.12.01 09:30  댓글주소  수정/삭제

      별 말씀을요..^^
      충분히 의심해 볼만한 내용이라고 보입니다.
      답변이 제한적이여서 오히려 부끄럽네요..