如何直接访问GPU?

8
作为大多数人都知道的,与GPU相比,CPU并没有很好地设计来进行浮点运算。我想知道如何在没有任何抽象层或驱动程序的情况下使用GPU的功率。我可以使用汇编语言、C、C++语言编写GPU程序吗?虽然汇编似乎可以帮助我直接访问GPU,但是C/C++可能需要一个中间库(例如OpenCL)来访问GPU。
让我再问你一个问题:如果没有第三方驱动程序,现代GPU的多少能力将暴露给程序员?
3个回答

8
接口没有文档说明,因此像OpenCL这样的方式是直接编程GPU的唯一实用方法。
如果没有驱动程序,您将被困在试图自行反向工程GPU的完整功能上。

是的,在实际意义上,这是不可能的。 - Dr. Snoopy
这并非不可能,只是极其不明智。要访问硬件,您必须基本上编写驱动程序,并花费数周/数月/数年学习硬件的工作原理。 - NoMoreZealots
<nitpick>据我所知,当前的英特尔和ATI芯片的接口文档已经有很详细的记录。然而,VIA的文档只是一个寄存器列表。</nitpick> - ninjalj
像英特尔HD这样的板载芯片或Ryzen这样的APU怎么样?我可以访问它们吗? - Jay

2
GPU制造商如NVDIA和ATI是封闭源代码公司,选择不向公众披露GPU架构和工作原理。这就是为什么我们不能像大多数CPU那样直接编程GPU的原因。我们唯一能够利用GPU进行计算的方法是使用提供的库,如NVDIA的CUDA。但是有一种可能的方法可以直接为计算编程GPU,但需要反向工程并记录所有GPU及其寄存器和系统调用,您知道这对于我们有限的资源和时间来说是不可能的。
附注:另一种方法是以GPU的核心开发人员身份登录并与供应商签署NDA(保密协议),但这对于像我们这样的初学者和个人来说不太可能发生。

ATI/AMD雇用了一些开源radeon驱动程序的开发人员,并发布了一些规格。据我所知,只有Nvidia完全拒绝公开任何东西。 - Peter Cordes

1

基本上,您需要在Windows或Linux上编写驱动程序。根据您要使用的芯片组,接口可能已经有文档记录。英特尔网站上有大量PDF文档可供参考。但是,这最多只是一个非常复杂的练习,您的代码只能用于那一组硬件。在大多数情况下,仅仅阅读和理解文档就需要花费一些时间,因为“糟糕,它并不是真正的工作方式”,而且如何做这个或那个的操作并没有记录,只有硬件和寄存器。然而,如果您真的想这样做,最好的方法是从Linux上的开源驱动程序开始,针对特定的芯片组进行调整以适应您的需求。总之,除了学习方面,这可能是一个不好的主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接