GPU上能用println!了?这事儿听着挺离谱。
VectorWare团队刚干了一件事:让Rust标准库在GPU上跑起来了。现在你在NVIDIA GPU的kernel里可以println!、可以读写文件、可以获取系统时间。以前GPU编程就像在原始部落里求生,现在直接通了电。
怎么回事?
Rust标准库分三层:core不需要堆,alloc加了堆,std再加操作系统相关的功能。GPU这玩意儿就是块专门算数的芯片,不懂什么叫文件系统,不懂什么叫网络。所以以前写GPU代码只能用#![no_std],在core和alloc两层里混。
VectorWare想了个招,叫hostcall。
你可以把它理解成GPU和CPU之间的外卖服务。GPU想打开文件,自己不会,就发个请求给CPU:“老哥帮我open一下这个路径。“CPU用操作系统API搞定,把结果传回去。
有些事情GPU自己能干,就不麻烦CPU了。比如std::time::Instant直接用GPU的硬件定时器就行,但std::time::SystemTime需要知道现实世界几点,GPU不知道,得问CPU。
他们甚至琢磨了一些更野的路子:写文件到/gpu/tmp表示这文件就留在GPU上别同步到CPU,网络请求localhost:42可以用来和GPU上其他线程通信。
代码长这样:
use std::io::Write;
use std::time::{SystemTime, UNIX_EPOCH};
#[unsafe(no_mangle)]
pub extern "gpu-kernel" fn kernel_main() {
println!("Hello from VectorWare and the GPU!");
let now = SystemTime::now();
let duration_since_epoch = now.duration_since(UNIX_EPOCH).unwrap();
println!("Current time: {}", duration_since_epoch.as_secs());
std::fs::File::create("rust_from_gpu.txt")
.unwrap()
.write_all(b"This file was created from a GPU!")
.unwrap();
}
除了那个extern "gpu-kernel"标记,和普通Rust代码几乎一模一样。
这事儿的意义在于:crates.io上那些用Rust标准库的库,理论上现在可以直接在GPU上用了。不用管它是不是#![no_std]兼容。
当然现在还在早期。只支持Linux加NVIDIA GPU加CUDA,hostcall有通信开销,不是所有std功能都能用。VectorWare团队里有Rust编译器的人,他们打算把这些改动上游化。
我第一反应是:调试终于不用像瞎子一样了。以前GPU代码出了问题,只能在那儿猜,现在能直接打印出来看。光是这点就值得折腾。
GitHub仓库应该快开源了,感兴趣可以盯着点。
