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.