卤化外部方法

Halide extern methods

本文关键字:方法 外部      更新时间:2023-10-16

我使用AOT编译来使用没有卤化物库的卤化物代码。

我在halidertime .h(可从源代码获得)中看到,我的.o文件中有许多外部方法可用。

halide_dev_mallochalide_dev_free非常有趣。我已经使用halide_copy_to_dev没有问题,但是我看到我的内存被分配了。如果我想在主机和设备之间做一个简单的内存占用,而使用halde_dev_malloc,这是可能的吗?

是否halidertime .h组所有可用的外部函数或目标文件包含很多其他?

周杰伦

halidertime .h旨在记录所有可被客户端调用或替换的例程。运行时中还有许多其他符号,但它们应该被视为内部符号。我们最近将这些例程移到它们自己的命名空间中,以表明它们是内部的。

设备后端的运行时仍在进行中,将有一个改进的设计,旨在允许更大的灵活性,并允许代码在多个后端通用工作的同时做更多的事情。目前,halde_dev_malloc将在Halide编译时通过Target为所选择的设备后端分配设备句柄。然而,这个句柄是特定于后端,因此为了使用它做任何事情,您必须知道使用的是哪个后端以及该后端如何与设备API交互。例如,为了使用memcpy的句柄,你需要知道设备后端支持某种统一的内存架构(CUDA术语中的"统一虚拟地址空间"),并且设备内存被分配了正确的API调用,以创建一个内存缓冲区,可以从设备和CPU使用相同的指针访问,等等。这取决于您使用的后端和平台,目前可能会也可能不会成功。(统一内存设计在很大程度上是最近才出现的。我们没有花很多精力去支持他们。

对于CUDA/PTX, halidde_dev_malloc调用cuMemAlloc,我认为它可能在默认情况下在许多系统的统一虚拟地址空间中,但我不确定。

是的,您可以使用halde_dev_malloc并手动复制内容。请参阅https://github.com/halide/Halide/blob/master/src/runtime/cuda.cpp第466行,了解halde_copy_to_dev的实际功能。

首先执行一个halde_dev_malloc,然后使用cuda的cuMemcpyHtoD。这里有一堆额外的逻辑,以防缓冲区在内存中不密集,但大多数情况下,它会变成一个单一的cuMemcpyHtoD。

我相信halidertime .h包含所有有用的外部函数。还有一些其他的内部变量,比如halde_create_cuda_context,可能会很有趣。要查看所有这些函数,请在此文件夹中查找以名称halde_开头的标记为WEAK的函数:https://github.com/halide/Halide/tree/master/src/runtime

或者您可以在卤化物生成的对象文件上运行nm,并查看所有以halde_开头的符号。