我使用AOT编译来使用没有Halide库的Halide代码。
我在HalideRuntime.h中看到(在源代码上可用)我的.o文件中有许多外部方法可用。
halide_dev_malloc 和 halide_dev_free 非常令人兴奋。我已经没有问题地使用 halide_copy_to_dev ,但我看到我的内存已经分配了。 如果我想在主机和设备之间做一个简单的memcpy并使用halide_dev_malloc,这可能吗?
HalideRuntime.h是否将所有可用的外部函数分组或者目标文件包含很多其他函数?
杰
答案 0 :(得分:2)
HalideRuntime.h旨在记录客户端可以调用或替换的所有例程。运行时中还有许多其他符号,但它们应被视为内部符号。我们最近将这些其他例程移动到它们自己的命名空间中,以表明它们是内部的。
设备后端的运行时仍在进行中,并且将会有一个改进的设计,旨在提供更大的灵活性,并允许代码执行更多操作,同时仍然可以跨多个后端进行操作。目前,halide_dev_malloc将为在Halide编译时通过Target选择的任何设备后端分配设备句柄。但是,此句柄是特定于后端的,因此为了对其执行任何操作,您必须知道使用了哪个后端以及后端如何与设备API进行交互。例如。为了将句柄与memcpy一起使用,您需要知道设备后端支持某种统一的内存架构("统一虚拟地址空间"在CUDA术语中),并且设备内存分配了正确的API调用创建一个内存缓冲区,可以使用相同的指针等从设备和CPU访问。取决于您使用的是哪个后端以及您所在的平台,目前可能会或可能不会。 (统一的内存设计在很大程度上是一个相当新的事情。我们还没有付出很多努力来支持它们。)
对于CUDA / PTX,halide_dev_malloc调用cuMemAlloc,我认为默认情况下它可能在许多系统上的统一虚拟地址空间中,但我不确定。
答案 1 :(得分:0)
是的,您可以使用halide_dev_malloc并手动复制内容。有关halide_copy_to_dev实际执行的操作,请参阅https://github.com/halide/Halide/blob/master/src/runtime/cuda.cpp第466行。
首先它执行halide_dev_malloc,然后使用cuda的cuMemcpyHtoD。如果缓冲区在内存中不密集,那么还有一堆额外的逻辑,但大多数时候它变成了一个cuMemcpyHtoD。
我相信HalideRuntime.h包含所有有用的extern函数。还有一些其他内部的东西,比如halide_create_cuda_context,可能会让人感兴趣。要查看所有这些内容,请在此文件夹中查找标记为WEAK且以名称halide_开头的功能:https://github.com/halide/Halide/tree/master/src/runtime
或者你可以在卤素生成的目标文件上运行nm并查看所有以卤素_开头的符号。