컴퓨터 과학의 핵심에 대한 거의 10년 간의 끊임없는 노력과 심층적인 연구 끝에 사람들은 마침내 꿈을 실현했습니다. GPU에서 고급 언어를 실행하는 것입니다.
지난 주말, Bend라는 프로그래밍 언어가 오픈소스 커뮤니티에서 열띤 토론을 촉발했고, GitHub의 별 수가 8,500개를 넘었습니다.
GitHub: https://github.com/HigherOrderCO/Bend
대규모 병렬 고급 프로그래밍 언어로서 아직 연구 단계에 있지만 제안된 아이디어는 이미 사람들을 놀라게 했습니다. 매우... 놀랐습니다. Bend를 사용하면 10년의 경험을 가진 C/CUDA 전문가가 아니더라도 멀티 코어 CPU/GPU용 병렬 코드를 작성할 수 있습니다. 마치 Python과 같은 느낌입니다!
예, Bend는 Python 구문을 사용합니다.
Bend는 Python 및 Haskell과 같은 표현형 언어를 지원하는 프로그래밍 패러다임입니다. 이는 CUDA 및 Metal과 같은 저수준 대안과는 다릅니다. Bend는 빠른 객체 할당, 고차 함수에 대한 완전한 폐쇄 지원, 무제한 재귀 및 코어 수에 따른 거의 선형 속도 향상 기능을 제공합니다. Bend는 대규모 병렬 하드웨어에서 실행되며 HVM2 기반 런타임 지원을 제공합니다.
프로젝트의 주요 기여자인 Victor Taelin은 브라질 출신입니다. 그는 X 플랫폼에서 Bend의 주요 기능과 개발 아이디어를 공유했습니다.
우선, Bend는 최신 기계 학습 알고리즘에 적합하지 않습니다. 이러한 알고리즘은 고도로 정규화(행렬 곱셈)되고 사전 할당된 메모리를 가지며 일반적으로 좋은 CUDA 커널이 이미 작성되어 있기 때문입니다.
Bend의 가장 큰 장점은 실용적인 애플리케이션에 있습니다. 왜냐하면 "실제 애플리케이션"에는 일반적으로 전용 GPU 코어를 만들 예산이 없기 때문입니다. 질문, CUDA로 웹사이트를 만든 사람은 누구인가요? 게다가 누군가 그렇게 한다고 해도 다음과 같은 이유로 실현 가능하지 않습니다.
1. 실제 응용 프로그램은 다양한 라이브러리에서 함수를 가져와야 하며 CUDA 커널은 해당 함수를 위해 작성할 수 없습니다. 동적 함수 및 클로저
3. 실제 애플리케이션은 예측할 수 없게 많은 양의 메모리를 할당합니다.
Bend는 몇 가지 새로운 시도를 완료했으며 어떤 경우에는 상당히 빠를 수 있지만 지금은 대규모 언어 모델을 작성하는 것이 확실히 불가능합니다.
저자는 JSON 할당 및 작업과 관련된 이중 정렬에 동일한 알고리즘 트리를 사용하여 이전 방법과 새로운 방법을 비교했습니다. Node.js는 3.5초(Apple M3 Max)이고 Bend는 0.5초(NVIDIA RTX 4090)입니다.
예, 현재 Bend는 단일 코어에서 Node.js를 능가하려면 전체 GPU가 필요합니다. 그러나 이는 대기업(구글)이 16년 동안 최적화해 온 JIT 컴파일러에 비하면 아직 초기 단계의 새로운 접근 방식이다. 앞으로도 많은 가능성이 있습니다.
사용 방법
먼저 Rust를 설치하세요. C 런타임을 사용하려면 C 컴파일러(예: GCC 또는 Clang)를 설치하고, CUDA 런타임을 사용하려면 CUDA 도구 키트(CUDA 및 nvcc) 버전 12.x를 설치하세요. Bend는 현재 Nvidia GPU만 지원합니다.
그런 다음 HVM2 및 Bend를 설치합니다.
cargo +nightly install hvmcargo +nightly install bend-lang
bend run<file.bend> # uses the Rust interpreter (sequential)bend run-c<file.bend> # uses the C interpreter (parallel)bend run-cu <file.bend> # uses the CUDA interpreter (massively parallel)
Bend의 병렬 프로그래밍
다음은 Bend에서 병렬로 실행될 수 있는 프로그램의 예입니다. 예를 들어,
(((1 + 2) + 3) + 4)
((1 + 2) + (3 + 4))
더 완전한 코드 예제를 살펴보겠습니다.
# Sorting Network = just rotate trees!def sort (d, s, tree):switch d:case 0:return treecase _:(x,y) = treelft = sort (d-1, 0, x)rgt = sort (d-1, 1, y)return rots (d, s, lft, rgt)# Rotates sub-trees (Blue/Green Box)def rots (d, s, tree):switch d:case 0:return treecase _:(x,y) = treereturn down (d, s, warp (d-1, s, x, y))(...)
该文件实现了具有不可变树旋转的双调排序器。它不是很多人期望的在 GPU 上快速运行的算法。然而,由于它使用本质上并行的分治方法,因此 Bend 会以多线程方式运行它。一些速度基准:
不执行任何操作即可实现 57 倍的加速。没有线程产生,没有锁、互斥锁的显式管理。我们只是要求 Bend 在 RTX 上运行我们的程序,就这么简单。
Bend 不限于特定范例,例如张量或矩阵。任何的并发系统,从着色器到类 Erlang 的 actor 模型都可以在 Bend 上进行模拟。例如,要实时渲染图像,我们可以简单地在每个帧上分配一个不可变的树:
# given a shader, returns a square imagedef render (depth, shader):bend d = 0, i = 0:when d < depth:color = (fork (d+1, i*2+0), fork (d+1, i*2+1))else:width = depth / 2color = shader (i % width, i /width)return color# given a position, returns a color# for this demo, it just busy loopsdef demo_shader (x, y):bend i = 0:when i < 5000:color = fork (i + 1)else:color = 0x000001return color# renders a 256x256 image using demo_shaderdef main:return render (16, demo_shader)
它确实会起作用,即使涉及的算法在 Bend 上也能很好地并行。长距离通信通过全局 beta 缩减(根据交互演算)执行,并通过 HVM2 的原子链接器正确有效地同步。
最后,作者表示 Bend 现在仅仅是第一个版本,还没有在合适的编译器上投入太多精力。大家可以预期未来每个版本的原始性能都会大幅提高。而现在,我们已经可以使用解释器,从 Python 高级语言的角度一睹大规模并行编程的样子了。
위 내용은 최초의 GPU 고급 언어인 대규모 병렬 처리는 Python 작성과 유사하며 별 8500개를 받았습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!