ComputeSharp, GPU에서 C # 실행

ComputeSharp, GPU에서 C # 실행

이 분기는 532 커밋 앞서, 3 커밋 마스터 뒤입니다.

ComputeSharp 는 DX12 및 동적으로 생성 된 HLSL 컴퓨팅 셰이더를 통해 GPU에서 병렬로 C # 코드를 실행하는 .NET Standard 2.1 라이브러리입니다. . 사용 가능한 API를 사용하면 GPU 버퍼를 할당하고 컴퓨팅 셰이더를 간단한 람다 식 또는 로컬 메서드로 작성할 수 있으며 캡처 된 모든 변수가 자동으로 처리되고 실행중인 셰이더로 전달됩니다.

  • NuGet에서 설치
  • 빠른 시작
    • 변수 캡처
    • 고급 사용
  • 요구 사항
  • 특별 감사

설치하려면 ComputeSharp , 패키지 관리자 콘솔 에서 다음 명령을 실행합니다.

  Install-Package ComputeSharp  

자세한 내용은 여기에서 확인할 수 있습니다.

계산 eSharp Gpu 모든 공용 API의 진입 점 역할을하는 클래스. Gpu.Default 버퍼를 할당하고 작업을 수행하는 데 사용할 수있는 현재 컴퓨터의 기본 GPU 장치에 액세스 할 수있는 속성입니다.

다음 샘플은 방법을 보여줍니다. 쓰기 가능한 버퍼를 할당하고 컴퓨팅 셰이더로 채운 다음 다시 읽습니다.

   //  간단한 셰이더 정의  공공의  읽기 전용   struct   MyShader  :  IComputeShader  {공공의  읽기 전용   ReadWriteBuffer   부동 > 완충기;  공공의  MyShader  ( ReadWriteBuffer   부동 >  버퍼 ) {. 버퍼  = 완충기;  } 공공의  무효   실행  ( ThreadIds   ID ) { 완충기  =  ID .엑스;  }}   //  GPU에 쓰기 가능한 버퍼를 배열의 내용과 함께 할당합니다   사용   ReadWriteBuffer   float >  버퍼  =  Gpu  .기본.  AllocateReadWriteBuffer   부동 > (1000);    //  셰이더 실행   Gpu .기본.에 대한 ( 1000 ,  새로운   MyShader  (완충기));    //  데이터 다시 가져 오기   부동  []  배열  = 완충기. GetData  (); 

변수 캡처

C #의 셰이더가 일부 로컬 변수를 캡처하는 경우 자동으로 GPU에 복사되어 HLSL 셰이더가 액세스 할 수 있습니다. 당신이 기대하는대로. 또한 ComputeSharp 는 셰이더에서 사용되는 정적 필드도 확인할 수 있습니다. 캡처 된 변수는 유효한 HLSL 유형으로 변환 할 수 있어야합니다. 스칼라 유형 ( int

, uint , float 등) 또는 알려진 HLSL 구조체 (예 : Vector3 ). 다음은 현재 라이브러리에서 지원하는 변수 유형 목록입니다.

.NET 스칼라 유형 : bool , int , uint , float , 더블

.NET 벡터 유형 : System.Numerics.Vector2 , Vector3 , Vector4

HLSL 유형 : Bool , Bool2 , Bool3 , Bool4 , Float2 , Float3 , Float4 , Int2 , Int3 , Int4 , UInt2 , Uint3

스칼라, 벡터 또는 버퍼 유형

의 정적 필드 공전 속성, 필드

Func 또는 대상 메서드가 인 유효한 HLSL 서명이있는 대리자) 정적

Func , 로컬 메서드 또는 캡처 된 변수가없는 대리자

공전 지원되는 대리자 유형

GPU 버퍼 할당

GraphicsDevice [height * width]에 대한 여러 확장 API가 있습니다. 세 가지 유형의 GPU 버퍼를 할당하는 데 사용할 수있는 클래스 : 상수 B uffer , ReadOnlyBuffer ReadWriteBuffer . 첫 번째는 16 바이트로 압축되고 버퍼 요소에 대해 가능한 가장 빠른 액세스를 제공하지만 최대 크기 (약 64KB)가 제한되어 있으며 각 요소의 크기가 배수가 아닌 경우 데이터를 복사 할 때 추가 오버 헤드가 필요합니다. 16. 다른 버퍼 유형은 단단히 압축되어 모든 종류의 작업에 적합하며 에 해당하는 HLSL이라고 생각할 수 있습니다. C #의 T [] 배열. 사용할 버퍼 유형이 확실하지 않은 경우 ReadOnlyBuffer 또는 ReadWriteBuffer , 해당 버퍼에 대한 쓰기 액세스가 필요한지 여부에 따라

참고 : 버퍼를 할당하는 API는 T : unmanaged 제약, HLSL 유형에 완전히 매핑 된 C # 유형에만 사용해야합니다. 이는 int , uint , 부동 , 더블 ,. NET 벡터 유형 또는 HLSL 유형. bool 유형 C # / HLSL 차이로 인해 버퍼에 사용해서는 안됩니다. Bool 대신 입력하세요.

고급 사용

ComputeSharp 를 사용하면 1 ~ 3 차원의 스레드 그룹을 통해 컴퓨팅 셰이더를 전달할 수 있으며 상수 및 읽기 전용 버퍼 등을 지원합니다. 또한 대부분의 HLSL 내장 함수는 Hlsl 수업. 다음은 이러한 모든 기능을 보여주는 고급 샘플입니다.

   //  일부 유틸리티 정적 함수로 클래스 정의  공공의  정적  수업   활성화  {공공의  정적   float   시그 모이 드  (흙손  x ) =>  1  /  (1  +    Hlsl .  Exp  (- 엑스));  }   //  셰이더 정의  공공의  읽기 전용   struct   ActivationShader  IComputeShader  { 비공개   읽기 전용   int   ;  공공의  읽기 전용   ReadOnlyBuffer   부동 >  x ;  공공의  읽기 전용   ReadWriteBuffer   부동 >  y ;  공공의  ActivationShader  ( int   너비 ,  ReadOnlyBuffer   부동 >  x ,  ReadWriteBuffer   float >  y ) {. =  너비 ;  .엑스 =  x ;  .와이 =  y ;  } 공공의  무효   실행  ( ThreadIds   ID ) { int   오프셋  =  ID .  X   +   ID .와이    너비 ;  흙손  파우  =  Hlsl .  파우 (엑스 [offset],  2 );  와이 [offset] =  활성화 .  시그 모이 드  ( 파우 );  }}  int   높이  =  10 ,  너비  =  10 ;  흙손 []  x  =  신규   부동  [height * width];    //  y를 합할 배열   부동  []  y  =  새로운  흙손[height * width];    //  결과 배열 (둘 다 일부 값이 있다고 가정)   사용   ReadOnlyBuffer   float >  xBuffer  =  Gpu . 기본. AllocateReadOnlyBuffer (엑스);   사용   ReadWriteBuffer   부동 >  yBuffer  =  Gpu . 기본. AllocateReadWriteBuffer  (와이);    //  셰이더 실행   Gpu .기본.에 대한 ( 너비 ,  높이 ,  새로운   ActivationShader  (,  x 버퍼 ,  yBuffer ));    //  데이터를 다시 가져 와서 y 배열에 씁니다   yBuffer .  GetData  (와이);

ComputeSharp 라이브러리에는 .NET Standard 2.1 지원이 필요하며 다음을 대상으로하는 응용 프로그램에 사용할 수 있습니다.

  • . NET Core>=3.0
  • Windows (x86 또는 x64)

또한 PC에서 라이브러리와 샘플을 컴파일하려면 .NET Core 3.1 및 C # 8.0을 지원하는 IDE가 필요합니다.

ComputeSharp 라이브러리는 Amin Delavar의 DX12GameEngine 저장소의 일부 코드를 기반으로합니다. 또한 ComputeSharp 는 다음 리포지토리 (Microsoft의 리포지토리 제외)의 NuGet 패키지를 사용합니다.

  • Vortice.Windows
  • ILSpy
  • 그루터기

더보기

Author: Tomi Buresh

Leave a Reply