반응형
CUDA를 C #으로 코딩 하시겠습니까?
C #으로 CUDA (nvidia gpu 언어)를 코딩하는 방법에 대한 정보를 찾고있었습니다. 나는 몇 개의 라이브러리를 보았지만 약간의 오버 헤드를 추가 할 것 같다 (p / invokes 등으로 인해).
- C # 애플리케이션에서 CUDA를 사용하려면 어떻게해야합니까? C ++로 코딩하고 dll로 컴파일하는 것이 더 낫습니까?
- 래퍼를 사용하는이 오버 헤드가 CUDA를 사용하여 얻을 수있는 이점을 없앨 수 있습니까?
- 그리고 C #과 함께 CUDA를 사용하는 좋은 예가 있습니까?
ManagedCuda 와 같은 멋진 완전한 cuda 4.2 래퍼가 있습니다. C # 프로젝트가 포함 된 솔루션에 C ++ cuda 프로젝트를 추가 한 다음
call "%VS100COMNTOOLS%vsvars32.bat"
for /f %%a IN ('dir /b "$(ProjectDir)Kernels\*.cu"') do nvcc -ptx -arch sm_21 -m 64 -o "$(ProjectDir)bin\Debug\%%~na_64.ptx" "$(ProjectDir)Kernels\%%~na.cu"
for /f %%a IN ('dir /b "$(ProjectDir)Kernels\*.cu"') do nvcc -ptx -arch sm_21 -m 32 -o "$(ProjectDir)bin\Debug\%%~na.ptx" "$(ProjectDir)Kernels\%%~na.cu"
c # 프로젝트 속성에서 이벤트를 빌드하기 위해 * .ptx 파일을 컴파일하고 C # 프로젝트 출력 디렉터리에 복사합니다.
그런 다음 새 컨텍스트를 만들고, 파일에서 모듈을로드하고, 함수를로드하고, 장치로 작업하면됩니다.
//NewContext creation
CudaContext cntxt = new CudaContext();
//Module loading from precompiled .ptx in a project output folder
CUmodule cumodule = cntxt.LoadModule("kernel.ptx");
//_Z9addKernelPf - function name, can be found in *.ptx file
CudaKernel addWithCuda = new CudaKernel("_Z9addKernelPf", cumodule, cntxt);
//Create device array for data
CudaDeviceVariable<cData2> vec1_device = new CudaDeviceVariable<cData2>(num);
//Create arrays with data
cData2[] vec1 = new cData2[num];
//Copy data to device
vec1_device.CopyToDevice(vec1);
//Set grid and block dimensions
addWithCuda.GridDimensions = new dim3(8, 1, 1);
addWithCuda.BlockDimensions = new dim3(512, 1, 1);
//Run the kernel
addWithCuda.Run(
vec1_device.DevicePointer,
vec2_device.DevicePointer,
vec3_device.DevicePointer);
//Copy data from device
vec1_device.CopyToHost(vec1);
이것은 과거에 nvidia 목록에 언급되었습니다.
http://forums.nvidia.com/index.php?showtopic=97729
다음과 같이 어셈블리에서 사용하려면 P / Invoke를 사용하기 쉽습니다.
[DllImport("nvcuda")]
public static extern CUResult cuMemAlloc(ref CUdeviceptr dptr, uint bytesize);
Nvidia의 블로그 게시물로 여기 에 설명 된 Hybridizer 도 언급 할 가치가 있다고 생각합니다. 다음 은 관련 GitHub 저장소입니다.
C # 애플리케이션에서 CUDA를 사용하는 데 사용할 수있는 몇 가지 대안이 있습니다.
- 별도의 프로젝트에 C ++ / CUDA 라이브러리를 작성하고 P / Invoke를 사용합니다. 네이티브 호출에 대한 P / invoke의 오버 헤드는 무시할 수있을 것입니다.
- ManagedCuda (전체 CUDA API를 노출 함) 와 같은 CUDA 래퍼를 사용합니다 . 전체 CUDA 런타임 API에 대해 DLLImport를 직접 작성할 필요가 없습니다 (편리함). 불행히도 별도의 프로젝트에서 자신의 CUDA 코드를 작성해야합니다.
- ( 권장 ) 무료 / 오픈 소스 / 독점 컴파일러 (C # 코드에서 cuda (소스 또는 바이너리)를 생성 함)를 사용할 수 있습니다.
온라인에서 몇 가지를 찾을 수 있습니다 . 예를 들어이 답변 을 살펴보십시오 .
참조 URL : https://stackoverflow.com/questions/6475490/coding-cuda-with-c
반응형
'Program Club' 카테고리의 다른 글
| INNER JOIN이 EXISTS보다 더 나은 성능을 제공 할 수 있습니까? (0) | 2020.12.31 |
|---|---|
| PostgreSQL 증분 백업을위한 최상의 방법 (0) | 2020.12.31 |
| 일부 명령은 수퍼 유저로 실행하고 일부 명령은 수퍼 유저로 실행하지 않고 실행하는 쉘 스크립트를 작성하는 방법은 무엇입니까? (0) | 2020.12.31 |
| 참조 된 종속성을 포함하여 NuGet 패키지 자동 빌드 (0) | 2020.12.31 |
| Entity Framework 6.1 및 MVC 5를 사용하여 데이터베이스에서 Code First를 사용한 후 모델을 동기화하는 방법은 무엇입니까? (0) | 2020.12.31 |