Skip to content

Commit 3bbb9b3

Browse files
committed
Update content and structure
1 parent f60ce46 commit 3bbb9b3

20 files changed

+1786
-3
lines changed

content/posts/ILGPU/00-summary.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
---
2+
title: "ILGPU 시리즈 요약"
3+
date: 2025-04-25 05:00:00
4+
draft: false
5+
description: "ILGPU 시리즈의 전체 내용을 요약하고 목차를 제공합니다."
6+
tags: ["ILGPU", "GPGPU", "dotnet", "CUDA", "OpenCL", "tutorial", "summary"]
7+
categories: ["ILGPU"]
8+
---
9+
10+
## ILGPU 시리즈 요약
11+
12+
ILGPU는 C# 기반의 강력한 GPGPU 라이브러리로, NVIDIA H100 같은 고성능 GPU를 활용해 다양한 응용에서 뛰어난 성능을 제공합니다. 이 시리즈는 ILGPU의 기본 개념부터 실제 사용 사례, 제약사항까지 포괄적으로 다루며, 초보자부터 숙련자까지 모두에게 유용한 정보를 제공합니다.
13+
14+
## 목차
15+
16+
1. [ILGPU 소개](/posts/ILGPU/01-introduction)
17+
- ILGPU의 정의와 배경
18+
- GPGPU의 개념과 중요성
19+
- ILGPU의 주요 특징과 장점
20+
- 간단한 벡터 덧셈 예제
21+
22+
2. [ILGPU 핵심 개념](/posts/ILGPU/02-core-concepts)
23+
- Context, Accelerator, Kernel의 역할
24+
- CUDA, OpenCL, CPU 백엔드 비교
25+
- 커널 실행 흐름
26+
- CUDA와 CPU 백엔드에서의 동일 커널 실행 예제
27+
28+
3. [ILGPU 설치와 설정](/posts/ILGPU/03-setup)
29+
- 리눅스(Ubuntu 22.04) 환경 설정
30+
- .NET 8.0 프로젝트 구성
31+
- CUDA 12.2 설치 및 설정
32+
- 기본 프로젝트 설정 예제
33+
34+
4. [ILGPU 기본 사용법](/posts/ILGPU/04-basic-usage)
35+
- 커널 작성 방법
36+
- 메모리 관리 기법
37+
- 디버깅과 프로파일링
38+
- 2D 배열 요소 제곱 계산 예제
39+
40+
5. [ILGPU 고급 기능](/posts/ILGPU/05-advanced-features)
41+
- Tensor 코어 활용
42+
- FP64 연산
43+
- 공유 메모리 최적화
44+
- 비동기 처리 기법
45+
46+
6. [ILGPU 실제 사용 사례](/posts/ILGPU/06-real-world-applications)
47+
- 희소 행렬 연산 (SpMV)
48+
- 이미지 처리 (가우시안 블러)
49+
- 머신 러닝 (행렬 곱)
50+
- cuSparse와의 성능 비교
51+
52+
7. [ILGPU의 제약과 대안](/posts/ILGPU/07-limitations-and-alternatives)
53+
- ILGPU의 주요 제약사항
54+
- cuSparse, Veldrid, ComputeSharp 비교
55+
- SpMV 성능 비교 예제
56+
- 라이브러리 선택 기준
57+
58+
## 시리즈 요약
59+
60+
이 시리즈는 ILGPU를 처음 접하는 개발자부터 고급 사용자까지 모두를 대상으로 합니다. 각 글은 이론과 실습을 균형있게 다루며, 특히 NVIDIA H100 GPU와 .NET 8.0 환경을 중심으로 실제적인 예제를 제공합니다.
61+
62+
1. **기초 개념**: ILGPU의 기본 개념과 설치 방법을 다루어 시작점을 제공합니다.
63+
2. **핵심 기능**: 커널 작성, 메모리 관리, 디버깅 등 핵심 기능을 상세히 설명합니다.
64+
3. **고급 기능**: Tensor 코어, FP64, 공유 메모리 등 고급 최적화 기법을 탐구합니다.
65+
4. **실제 응용**: 희소 행렬 연산, 이미지 처리, 머신 러닝 등 실제 사용 사례를 다룹니다.
66+
5. **제약과 대안**: ILGPU의 한계와 대안 라이브러리를 비교 분석합니다.
67+
68+
이 시리즈를 통해 독자들은 ILGPU를 효과적으로 활용하는 방법을 배우고, 자신의 프로젝트에 적합한 GPGPU 라이브러리를 선택할 수 있는 지식을 얻을 수 있습니다.
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
---
2+
title: "ILGPU 소개와 배경"
3+
date: 2025-04-25 06:00:00
4+
draft: false
5+
description: "ILGPU의 기본 개념과 GPGPU 프로그래밍에서의 역할을 알아봅니다."
6+
tags: ["ILGPU", "GPGPU", "dotnet", "CUDA", "OpenCL", "tutorial"]
7+
categories: ["ILGPU"]
8+
---
9+
10+
## ILGPU란 무엇인가?
11+
12+
ILGPU는 C# 기반의 고성능 GPGPU(General-Purpose computing on Graphics Processing Units) 라이브러리로, GPU의 병렬 연산 능력을 .NET 환경에서 쉽게 활용할 수 있도록 설계되었습니다. ILGPU는 CUDA, OpenCL, CPU 백엔드를 지원하며, 리눅스, 윈도우, macOS 같은 다양한 플랫폼에서 동작합니다. 이 라이브러리는 복잡한 GPU 프로그래밍을 C# 개발자 친화적인 API로 추상화하여, 고성능 연산 작업을 간소화합니다.
13+
14+
ILGPU는 특히 대규모 데이터 처리, 과학 연산, 이미지 처리, 머신 러닝과 같은 분야에서 유용합니다. 예를 들어, NVIDIA H100 같은 데이터센터 GPU를 활용해 수백만 행의 희소 행렬 연산을 처리하거나, 실시간 이미지 필터링을 구현할 수 있습니다. 오픈소스 프로젝트로 MIT 라이선스를 따르며, 활발한 커뮤니티와 함께 유지보수되고 있습니다([ILGPU GitHub](https://github.com/m4rs-mt/ILGPU)).
15+
16+
## GPGPU와 ILGPU의 역할
17+
18+
GPGPU는 GPU의 병렬 연산 능력을 그래픽 렌더링 외의 일반 연산에 활용하는 기술입니다. 현대 GPU는 수천 개의 코어를 통해 대규모 병렬 연산을 수행하며, CPU에 비해 특정 작업(예: 행렬 연산, FFT)에서 수십 배 높은 성능을 제공합니다. 예를 들어, NVIDIA H100은 132개의 SM(Streaming Multiprocessor)과 80GB HBM3 메모리를 갖추고, Tensor 코어로 행렬 연산을 가속화합니다.
19+
20+
그러나 GPU 프로그래밍은 CUDA(C/C++ 기반)나 OpenCL 같은 저수준 언어를 요구하며, 복잡한 메모리 관리와 커널 최적화가 필요합니다. ILGPU는 이러한 장벽을 낮추며, C# 개발자가 .NET 8.0/9.0 환경에서 GPU 병렬 연산을 구현할 수 있게 합니다. ILGPU는 C#으로 작성된 커널을 JIT(Just-In-Time) 컴파일하여 GPU에서 실행하며, CUDA와 OpenCL 백엔드를 통해 H100 같은 최신 GPU를 지원합니다.
21+
22+
## ILGPU의 장점
23+
24+
ILGPU는 다음과 같은 장점으로 주목받습니다:
25+
26+
- **C# 통합**: .NET 생태계와 완벽히 호환되며, Visual Studio 또는 Rider에서 디버깅 가능.
27+
- **크로스 플랫폼**: 리눅스(Ubuntu 22.04), 윈도우, macOS 지원, CUDA/OpenCL 백엔드로 유연성 제공.
28+
- **고수준 API**: 복잡한 GPU 메모리 관리와 커널 실행을 간소화.
29+
- **성능**: H100의 Tensor 코어, FP64, HBM3 메모리를 활용해 고성능 연산 가능.
30+
- **오픈소스**: MIT 라이선스, 활발한 커뮤니티([ILGPU Docs](https://ilgpu.net/docs/)).
31+
32+
## 주요 사용 사례
33+
34+
ILGPU는 다양한 고성능 연산 작업에 활용됩니다:
35+
36+
- **희소 행렬 연산**: 대규모 희소 행렬-벡터 곱(SpMV), 선형 시스템 해소(예: conjugate gradient).
37+
- **이미지 처리**: 컨볼루션, 가우시안 블러, 실시간 필터링.
38+
- **과학 연산**: FFT, 몬테카를로 시뮬레이션, 물리 시뮬레이션.
39+
- **머신 러닝**: 행렬 곱, 신경망 연산 가속.
40+
41+
예를 들어, H100에서 ILGPU를 사용해 1,000,000 행의 희소 행렬 연산을 처리하면, CPU 대비 수십 배 빠른 성능을 얻을 수 있습니다. 이는 데이터 과학, 엔지니어링, 그래픽스 분야에서 강력한 도구로 작용합니다.
42+
43+
## ILGPU와 다른 라이브러리 비교
44+
45+
ILGPU는 Veldrid, cuSparse 같은 라이브러리와 비교되며, 각기 다른 강점을 가집니다:
46+
47+
### Veldrid:
48+
- **특징**: Vulkan, Metal, Direct3D를 지원하는 그래픽 중심 라이브러리, 컴퓨팅 셰이더로 GPGPU 가능.
49+
- **장점**: 그래픽 렌더링과 GPGPU 통합, 크로스 플랫폼.
50+
- **단점**: GPGPU보다 그래픽에 초점, 희소 행렬 연산 최적화 부족, 최근 업데이트 감소.
51+
- **비교**: ILGPU는 GPGPU에 특화된 고수준 API와 CUDA 백엔드로 H100에서 더 나은 성능 제공.
52+
53+
### cuSparse:
54+
- **특징**: NVIDIA CUDA 기반 희소 행렬 연산 라이브러리, H100에 최적화.
55+
- **장점**: SpMV, Cholesky 분해 같은 특화 루틴, Tensor 코어 활용, 최고 성능.
56+
- **단점**: CUDA 전용, C# 통합 위해 ManagedCUDA 필요.
57+
- **비교**: ILGPU는 C# 친화적이고 크로스 플랫폼이나, cuSparse의 최적화된 성능에는 미치지 못함.
58+
59+
### OpenTK:
60+
- **특징**: OpenGL 기반 그래픽 라이브러리, GPGPU 지원 제한적.
61+
- **비교**: ILGPU는 GPGPU에 특화, OpenTK는 그래픽 중심.
62+
63+
ILGPU는 C# 개발자와 크로스 플랫폼 프로젝트에 적합하며, cuSparse의 성능이 필요하지 않은 경우 강력한 대안입니다.
64+
65+
## 간단한 예제: 벡터 덧셈
66+
67+
ILGPU의 기본 동작을 이해하기 위해, 두 대규모 벡터의 요소별 덧셈을 구현하는 예제를 살펴보겠습니다. 이 예제는 H100의 CUDA 백엔드를 사용하며, .NET 8.0/9.0 환경에서 실행됩니다.
68+
69+
### 예제 코드
70+
71+
```csharp
72+
using ILGPU;
73+
using ILGPU.Runtime;
74+
using ILGPU.Runtime.Cuda;
75+
using System;
76+
77+
class Program
78+
{
79+
static void Main()
80+
{
81+
// ILGPU 컨텍스트 초기화
82+
using var context = Context.Create(builder => builder.Cuda());
83+
using var accelerator = context.CreateCudaAccelerator(0); // H100 선택
84+
85+
// 데이터 준비
86+
const int size = 1_000_000;
87+
float[] a = new float[size];
88+
float[] b = new float[size];
89+
float[] result = new float[size];
90+
Random rand = new Random();
91+
for (int i = 0; i < size; i++)
92+
{
93+
a[i] = (float)rand.NextDouble();
94+
b[i] = (float)rand.NextDouble();
95+
}
96+
97+
// GPU 메모리 할당
98+
using var bufferA = accelerator.Allocate1D<float>(size);
99+
using var bufferB = accelerator.Allocate1D<float>(size);
100+
using var resultBuffer = accelerator.Allocate1D<float>(size);
101+
102+
// 데이터 업로드
103+
bufferA.CopyFromCPU(a);
104+
bufferB.CopyFromCPU(b);
105+
106+
// 커널 정의 및 실행
107+
var kernel = accelerator.LoadAutoGroupedStreamKernel<
108+
Index1D, ArrayView<float>, ArrayView<float>, ArrayView<float>>(
109+
(index, a, b, result) => { result[index] = a[index] + b[index]; });
110+
kernel(size, bufferA.View, bufferB.View, resultBuffer.View);
111+
112+
// 결과 다운로드
113+
resultBuffer.CopyToCPU(result);
114+
115+
// 결과 확인 (샘플링)
116+
Console.WriteLine($"Result[0]: {result[0]} (Expected: {a[0] + b[0]})");
117+
Console.WriteLine($"Result[{size-1}]: {result[size-1]} (Expected: {a[size-1] + b[size-1]})");
118+
119+
// 정리
120+
accelerator.Dispose();
121+
}
122+
}
123+
```
124+
125+
### 설명
126+
127+
- **컨텍스트와 액셀러레이터**: CUDA 백엔드로 H100 초기화.
128+
- **데이터**: 1,000,000 요소의 두 벡터를 GPU 메모리에 업로드.
129+
- **커널**: C#으로 작성된 병렬 덧셈 커널, ILGPU가 CUDA PTX로 컴파일.
130+
- **실행**: H100에서 병렬 연산 수행, 결과 다운로드.
131+
- **환경**: 리눅스(Ubuntu 22.04), .NET 8.0, CUDA 12.2.
132+
133+
### 실행
134+
135+
```bash
136+
dotnet new console -n ILGPUVectorAdd
137+
cd ILGPUVectorAdd
138+
dotnet add package ILGPU
139+
# 위 코드로 Program.cs 작성
140+
dotnet run
141+
```
142+
143+
## ILGPU의 가치와 전망
144+
145+
ILGPU는 C# 개발자에게 GPU 병렬 연산의 문을 열어주는 강력한 도구입니다. .NET 생태계와의 원활한 통합, 크로스 플랫폼 지원, 그리고 H100 같은 최신 GPU의 성능 활용은 ILGPU를 데이터 과학, 그래픽스, 머신 러닝 분야에서 매력적인 선택으로 만듭니다. cuSparse 같은 특화 라이브러리에는 성능 면에서 뒤지지만, C#의 생산성과 유연성으로 이를 상쇄합니다.
146+
147+
이후 섹션에서는 ILGPU의 아키텍처, 설치 방법, 고급 최적화(예: 희소 행렬 연산), 실제 사용 사례를 다루며, H100에서의 실질적인 구현을 탐구할 것입니다. ILGPU를 통해 GPU의 잠재력을 .NET에서 풀어보세요!
148+
149+
## 다음 단계
150+
151+
이제 ILGPU의 기본 개념을 이해했으니, 다음 글에서는 ILGPU의 핵심 개념(Context, Accelerator, Kernel)과 백엔드 비교에 대해 자세히 알아보겠습니다.
152+
153+
[ILGPU 시리즈 요약으로 돌아가기](/posts/ILGPU/00-summary)

0 commit comments

Comments
 (0)