서론

C#은 개인적으로 쓰기 참 편한언어이다.

편견일지는 몰라도 C++처럼 일일히 선언, 초기화, 메모리관리, 헤더파일관리 등을 안해도 알아서 처리하고

Java보다는 보기가 편하며

Visual Studio랑 InteliSense라는 엄청난 IDE도 존재한다.

그리고 .Net 4.5에 들어서면서 Parallel클래스가 생기고 심지어 스레드 관리도 할필요없이 멀티코어를 모두 사용가능한 프로그램을 만들수 있게됬다.

그럼에도 GPGPU의 영역은 아직 C#이 다다르진 못한것 같다.

뭐 그도 그럴게 (아직 모두 알아본건 아니지만) 대표적으로 GPGPU를 통해 할수 있는것이 행렬의 덧셈행렬의 곱셈밖에 없기 때문이다.

솔직히 기계학습이나 영상처리면에선 이런기능이 꽤나 유용하지만 일반적인 프로그래머가 이런류를 다룰일은 거의 없을것이다. 그리고 다루게 된다면 다들 파이썬을 쓰는게 훨씬 간편하다는걸 잘 알고있을테니 말이다.

그래도 언제나 (적더라도) 수요는 있는법

지금부터 C#에서 GPGPU를 사용하기위해 찾아본 몇 안되는 방법을 소개하겠다.

본론

  • C++ AMP를 사용해 C#에서 마샬링 하기.

    이 방법은 마이크로소프트에서 제공하는 C++ AMP를 사용해 GPGPU관련 코딩을 마친뒤 C#에서 마샬링해 함수형태로 GPGPU를 활용가능하다.

    • 장점 : 윈도우PC에서는 대부분 사용가능하다. DirectX11을 사용해서 연산을 하기때문이다. 그래픽카드도 가리지 않고 잘되며 코딩 난이도도 꽤 쉬운편이다. C++그냥 조금만해도 이용 가능한정도.

    • 단점 : 윈도에서만 된다. 리눅스에선 못한다. 너무 기본만 구현되 있어서 다 자기가 구현해야한다.

  • Alea GPU이용하기

    이 방법은 Nvidia에서 제공하는 CUDA를 C#에서 쓰기위해 만들어진 Alea GPU를 황용하는것이다.

    • 장점 : C#에서 꽤 잘돌아가고, CrossPlatform이 기본모토라서 윈도뿐 아니라 Mac이나 Linux에서도 잘돌아간다. 코딩난이도도 쉬운편이고 F#을 지원해 함수형으로도 사용가능하다. 거기다 디버깅도 잘된다는거 같다.
    • 단점 : CUDA기반이기 때문에 Nvidia에서 CUDA지원 그래픽카드에서만 돌아간다. 라데온이나 내장그래픽 활용은 못한다. 대부분의 노트북이 (인텔이 잘만들어서)내장그래픽화되가는걸 생각하면 단점이 될수도 있다.
  • F#에서 짜고 C#에서 쓰기

    F#은 다른 언어들과는 다르게 하스켈과 같은 함수지향언어이다. 함수지향인만큼 병렬화에 큰 강점을 가져 GPGPU라이브러리가 꽤 있다. 대표적으로 Alea GPU ,StatFactory, FSCL(OpenCL을 F#용으로 포팅한것이다.), GpuLinq(이것도 OpenCL) 등이 있고 이걸 DLL로 만들어 C#에서 가져다 쓰면 된다.

    • 장점 : 라이브러리 존재도 많고 선택지도 다양하며 자기 취양대로 가져다쓸수 있으며 함수지향언어기때문에 병렬화가 쉽다.
    • 단점 : 함수지향언어기에 병렬화가 쉬울지라도 그 개념자체에 익숙해지는데 시간이 걸린다.
  • CUDAfy

    CUDAfy는 한번 작성하면 OpenCL과 CUDA를 모두 쓸수 있다.

    • 장점 : 한번 작성으로 CUDA랑 OpenCL를 한번에 쓸수있는 편리함
    • 단점 : 커뮤니티가 작고 아직 초기버전이라 버그가 많다. 리눅스는 쓸수 있도록 한다면서 2015년 9월기준으로 아직 제대로 지원하는것 같지는 않다. 조금더 성장하면 꽤 유용하지 않을까? 기대되는 프로젝트이다.
  • C#에서 OpenCL쓰기

    OpenCL은 지원되는 디바이스도 많고(인텔 내장그래픽에서 ARM프로세서까지) 꽤나 로우레벨을 다루는 만큼 자기 취향대로 코딩이 쉽지만 그게 역으로 작용해 그만큼 코딩이 어렵다. C++에서 컴파일하고 C#에서 마샬링 해야한다.

    • 장점 : 모든걸 자기가 직접 하는만큼 가장 효율적이고 가장 빠른속도를 자랑한다. 이걸 할줄안다면 모바일용 GPGPU도 손쉽게 만들수 있을지도 모른다.
    • 단점 : 그걸 모두 상회할정도로 복잡하고 어려우며 이걸 공부하게될 시간에 다른 방법을 써 코딩하는게 더 효율적이다.
  • 그냥 내제되있는 라이브러리 쓰기

    자신이 만들려는 프로그램목적에 따라 라이브러리를 찾아가다보면 GPGPU가 덤으로 껴있는경우가 종종있다. 예를들면 OpenCVSharp같은경우처럼 특정 알고리즘에 한해 알아서 GPGPU를 돌려주는것 같은것 말이다. 자주 존재하는경우는 아니지만 일단 찾아보자. 이거쓰는게 훨씬 편한경우가 많다.

결론

C#도 나름 GPGPU를 쓰기위한 방법이 존재한다. 그리고 대부분은 C++을 쓰는것보다 쉽다. 하지만 그래도 여전히 파이썬보다는 어렵다. 상용프로그램만드는정도로서는 추천하지만 단순 연구용혹은 논문작성용이라면 파이썬을 쓰는게 속편할 것이다.