c #으로 GPU 활용하기


135

그리드에서 더 많은 처리 능력을 얻으려고합니다.

모든 CPU / 코어를 사용하고 있으며 C #으로 GPU를 사용할 수 있습니까?

누구나 라이브러리를 알고 있거나 샘플 코드를 가지고 있습니까?

답변:


156

[ 이 답변조차 꽤 오래되어 OCT 2017 편집 ]

이 답변의 대부분은 상당히 오래되었으므로 각 프로젝트가 어디에 있다고 생각하는지에 대한 업데이트 된 요약을 제공 할 것이라고 생각했습니다.

  • GPU.Net (TidePowerd)-6 개월 정도 전에 시도해 보았지만 약간의 작업이 필요했지만 작동했습니다. 컴파일 타임에 C # 커널 코드를 cuda로 변환합니다. 불행히도 그들의 웹 사이트는 다운되었고 github은 몇 년 동안 업데이트되지 않았습니다.

  • Cudafy- 오픈 소스이며 사용하기 매우 쉽습니다. 런타임에 C # 커널 코드를 cuda로 변환합니다 (직렬화 및 캐시 가능). CPU에서 동일한 커널 코드를 쉽게 실행할 수 있습니다 (주로 디버깅 용). 여러 GPU를 지원합니다. 여기에 다른 것보다 더 많은 예제가 있습니다. 다른 답변에서 언급 한 상용구 코드는 최소한이며 제 경우에는 코드 작동 방식에 대한 이해에 도움이되었습니다. Cuda / Nvidia 만 가능합니다. 불행히도 그들은 몇 년 동안 솔루션을 업데이트하지 않은 것으로 보입니다 (2015 년 최신 커밋-cuda 7.0 지원).

  • 하이브리드 라이저 . C #을 CUDA로 컴파일하는 상용 솔루션. Visual Studio 마켓 플레이스 에서 무료 커뮤니티 에디션을 제공하고 github에서 샘플을 제공합니다 .

  • 소비자 GPUS 를위한 무료 커뮤니티 에디션을 갖춘 AleaGPU 상업용 솔루션. 자세한 내용은 Daniel의 의견을 참조하십시오.

  • 브라흐마-OpenCL을 통해 LINQ 표현식을 실행합니다 (따라서 AMD도 지원). 많은 문서 / 예제. 2011 년 마지막 업데이트.

  • C $ -10 년 전에 마지막 개발이 이루어졌습니다 ...

  • Microsoft Accelerator- 더 이상 활발히 개발되고있는 것처럼 보이지 않습니다.

  • 일부 다른 것 ( C ++ AMP , OpenTK-dead / Cloo )-이것들 중 다수는 바인딩 일뿐입니다. 즉 C #에서 GPU를 호출 할 수 있지만 커널 코드 (실제로 GPU에서 실행되는 코드)를 작성해야합니다. C 또는 OpenCL은 다른 언어를 사용하고 학습해야 함을 의미합니다.

내가 말했듯이 Cudafy는 다른 모든 것보다 Cudafy를 추천 할 것입니다-OpenCL과 Cuda에서 실행될 수 있다면 완벽 할 것입니다.

Suda 2013 편집 Cudafy를 사용하면 CUDA와 OpenCL 을 모두 컴파일 할 수 있으므로 모든 GPU에서 동일한 C # 코드를 실행할 수 있습니다. OpenCL 컴파일을 아직 테스트하지는 않았지만 환상적으로 들립니다.


31
빠르게 발전하는 주제에서 유용한 질문을 업데이트하면 +1됩니다.
philologon

2
Alea GPU quantalea.com 은 모든 .NET 언어에 대한 CUDA 지원을 제공하고 완전히 크로스 플랫폼이며 .NET GPU 코드의 디버깅 및 프로파일 링에 대한 최상의 개발자 경험을 제공합니다.
Daniel

Cudafy의 OpenCL 지원은 매우 나쁩니다. 프로젝트가 커질 때 컴파일조차 할 수 없었습니다. 따라서 일반 OpenCL을 사용하고 C #에 바인딩합니다.
Libor

Cudafy를 사용하는 OpenCL은 저에게 잘 작동합니다. 몇 년 동안 사용해 왔습니다
mcmillab

미래 방문자를 돕기 위해 프로젝트에 대한 링크를 추가했습니다.
Dan Atkinson

46

Microsoft Research Accelerator 는 .NET GP GPU 라이브러리입니다.


라이센스 정책이 좋지 않은 훌륭한 프로젝트였습니다. 불행히도, MS 사이트에서는 더 이상 사용할 수 없습니다 ...
ForNeVeR

25

브라마를 발견했습니다 ... 또한 GPU에서 메소드를 실행할 수있는 GPGPU 제공 업체가 있습니다 ... 질문에 감사드립니다 ... 오늘 새로운 것을 배웠습니다. :)


10

탐험의 수단으로 XNA Game Studio를 추천 할 수 있습니까? 분명히 게임 작성에 적합하지만 관리되는 DirectX에서 이전에 사용했던 것보다 그래픽 카드에 대한 액세스 권한과 기능 열거 기능 및 셰이더 개발에 대한 액세스 권한이 훨씬 뛰어납니다. WinForms와 XNA를 하이브리드 애플리케이션으로 결합하는 방법도 있습니다 :

http://www.ziggyware.com/news.php?readmore=866

쉐이더 프로그래밍 학습에 약간의 노력을 기울여야하지만 (XNA는 HLSL을 지원함) 이것은 nVidia의 CUDA와 같은 공급 업체별 솔루션을 학습하는 것보다 간단한 접근법 일 수 있습니다. 장점은 100 % 관리 환경에서 프로그래밍 할 수 있다는 것입니다. 다음은 몇 가지 HLSL 링크입니다.

http://www.ziggyware.com/weblinks.php?cat_id=9

GPGPU 사이트는 또한 범용 GPU 프로그래밍을위한 권장 대상입니다.

http://gpgpu.org/

행운을 빕니다!


1
미래의 인사. 당시에는 훌륭한 답변 이었지만 (XNA에 약간
덤벼 들었음

@MickyD 그레이트 스캇! DeLorean에 뛰어 들어 2018 년을 여행했을 때이 답변을 업데이트하는 것을 완전히 잊어 버렸습니다! XNA에 여전히 관심이 있다면, 영적 후임자는 아마도 크로스 플랫폼 MonoGame 일 것입니다 : monogame.net
Dave R.

롤 감사합니다. 확인하겠습니다
MickyD

9

방법에 대한 http://www.tidepowerd.com/ GPU.NET?


2
아이디어가 마음에 들지만 2 년 전에 기술 지원 질문에 대한 답변을 중단했으며 약 1 년 동안 사이트가 다운되어 프로젝트가 종료 된 것으로 생각합니다. 분명히 저자 는 SO 에 있습니다.
BlueRaja-대니 Pflughoeft

Tidedpowerd는 GPU.NET 개발을 중단하고 비즈니스를 종료했습니다.
Daniel

9

또 다른 하나는 CUDAfy 입니다. 메소드 속성만큼 간단한 것이 전체 메소드가 GPU에서 실행될 수 있다는 점에서 GPU.Net처럼 들립니다. 그러나 GPU.Net과 달리 CUDAfy는 무료이며 오픈 소스입니다.

CUDAfy는 GPU.Net에 보일러 플레이트 코드가 필요없는 것으로 보입니다 (문서에 따르면 "빌드 툴에 의해 자동으로 주입됩니다") .


CUDAfy를 사용하여 애플리케이션을 빌드하는 예는 다음 과 같습니다.


8

글쎄 이것은 꽤 오래된 질문이며, 질문을 받았기 때문에 많은 것이 바뀌 었습니다.
.Net을 사용하여 GPU 코드를 작성하는 또 다른 옵션은 Alea GPU 에서 아무도 언급하지 않았습니다 . C #, F # 및 VB를 다룹니다.

.NET 및 Mono 용 전문 GPU 소프트웨어 개발 환경. 진정한 크로스 플랫폼

F # 공식 사이트에서 Alea는 GPGPU 프로그래밍에서 F #을 사용 하는 첫 번째 옵션 입니다.
이 프레임 워크를 알기 위해서는 포괄적 인 예제 목록을 살펴 보는 것이 좋습니다 .


1
답을보고 내 게시물을 삭제합니다. 세스 후아 레즈에 의해 또한 채널 9 인터뷰를 참조하십시오 여기 및 SO 태그 여기에 )
데이비드 Cuccia

@DavidCuccia 이전 답변 확인에 훌륭합니다. 채널 9 링크 (2016 년 12 월!)
Rsh


@Daniel 나는 "채널 9 녹화에 대한 링크"를 의미했다. 모호한가? 어쨌든 지적 해 주셔서 감사합니다.
Rsh

@DavidCuccia 혼란을 드려 죄송합니다. 링크가 잘 보이지 않습니다
Daniel

7

브라흐마 외에도 C $ ( "C Bucks"로 발음)을 살펴보십시오 . CodePlex 사이트에서 :

[C $]의 목표는 최신 GPU 및 CPU에서 완벽한 병렬 프로그래밍을위한 통합 언어 및 시스템을 만드는 것입니다.

C #을 기반으로하며 느리게 평가되며 여러 액셀러레이터 모델을 대상으로합니다.

현재 예정된 아키텍처 목록에는 GPU, 다중 코어 CPU, 다중 GPU (SLI, CrossFire) 및 다중 GPU + 다중 CPU 하이브리드 아키텍처가 포함됩니다.


7

도시에는 새로운 Microsoft 솔루션 인 C ++ AMP ( 여기 소개 )가 있습니다.

C #에서 사용하는 방법은 P / Invoke를 통해, 여기 에서는 데스크톱 앱용으로, 여기 에서는 Metro 전화 용 앱 으로 시연 됩니다 .

편집 : C ++ AMP에는 공개 사양 이 있으므로 MS 컴파일러 또는 Windows 전용이 아닙니다.

편집 : 분명히 기술 은 이제 "유지 관리 모드"에 있습니다. 즉, 버그를 수정하고 있지만 적극적으로 개발하지는 않습니다.


2

관리되는 DirectX가 어떻게 든 작동 할 수 있습니다.


2
미래의 인사. 당시에는 좋은 대답 이었지만, 슬프게도 MDX는 이제 XNA로 대체되어 없어져 버렸습니다.
MickyD

2

GPU가 모두 동일한 브랜드 인 경우 Nvidia의 CUDA 또는 ATI의 스트림을 통해 공급 업체로부터 GPGPU 지원을받을 수 있습니다. AFAIK는 P / Invoke를 통해 사용할 수있는 DLL을 제공합니다.


1

CenterSpace Software는 NMath 라이브러리에 C # 프로젝트에 추가 할 수 있는 GPU 기반 컴퓨팅 기능을 제공합니다. 상업용 제품입니다.


0

사용자 정의 커널이 필요한 자체 알고리즘을 적용하려는 경우 :

최근에 OpenCL을 사용 하는 이 github 저장소 에 내 오픈 소스 프로젝트를 업로드했습니다 .

그것이하는 것 (위키 페이지에서도 확인할 수 있음)은 사용자로부터 여러 OpenCL 가능 장치와 커널 문자열을 선택하고 C # 또는 C ++ 배열 래퍼를 만든 다음 자동로드 밸런서 및 PC에서 좋은 효율을 얻으려면 파이프 레이서 (지연 시간 숨기기).

다음은 사용법의 예입니다 (1024 개의 작업 항목이 모든 장치에 파티션되어 있으며 각각 동일한 코드를 실행하지만 다른 데이터 및 threadId를 사용함).

// select all GPUs and all CPUs in same pc
ClNumberCruncher gpuCpu = new ClNumberCruncher(AcceleratorType.GPU | AcceleratorType.CPU, @"
    __kernel void distributeTanh(__global float * data,__global int * data2)
    {
         int threadId=get_global_id(0);
         data[threadId]=tanh(data[threadId]);
         data2[threadId]=threadId;
    }    
");

// a wrapper that can hold C# or C++ arrays
ClArray<float> data = new ClArray<float>(1024);
ClArray<int> data2 = new int[1024];

// load-balances "distributeTanh" on all devices more fairly 
// at each repeatation of this line with same compute-id(1 here)
data.nextParam(data2).compute(gpuCpu, 1, "distributeTanh", 1024);
// threadId in kernel receives unique continuous id value for all work
// either it is in cpu or gpu doesn't matter
// compute method also has parameters to enable pipelining to 
// elliminate buffer copy latencies or compute latencies

모두 더 이상 사용하지 않으면 소멸자와 함께 모든 C ++ 리소스를 해제합니다.

그러나 성숙하지는 않으므로 github 이슈 탭에 "문제"를 추가하십시오. 다중 PC 클러스터 관련 클래스는 작동하지 않으며 아직 영어로 번역되지 않았지만 최소한 단일 PC에서 모든 장치를 사용할 수 있습니다.


-2

WPF는 또한 GPU를 사용하며 HLSL을 사용하여 사용자 지정 셰이더를 추가 할 수 있습니다.


WPF에는 내 지식에 대한 GP GPU 계산 액세스 권한이 없습니다. WPF System.Windows.Media 그래픽에 대해 이야기 할 때 실제 DirectX는 아닙니다. SharpDX 또는 SlimDX를 사용한 하위 레벨 정점 프로그래밍과 비교할 때 매우 느립니다.
Pasi Tuomainen

WPF의 GPU 가속 사용자 지정 효과에 대한 일련의 기사에 대한 링크를 추가했습니다.
Mark Cidade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.