0

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

我在 HalideRuntime.h (可在来源中获得)中看到我的 .o 文件中有许多可用的外部方法。

halide_dev_mallochalide_dev_free非常有趣。我已经毫无问题地使用了 halide_copy_to_dev,但我看到我的内存已分配。如果我想在主机和设备之间做一个简单的 memcpy 并改用 halide_dev_malloc,这可能吗?

HalideRuntime.h 是否对所有可用的外部函数进行了分组,或者目标文件是否包含许多其他函数?

周杰伦

4

2 回答 2

2

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

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

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

于 2014-08-22T21:27:57.507 回答
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 包含所有有用的外部函数。还有一些其他内部的,比如 halide_create_cuda_context 可能会很有趣。要查看所有这些,请在此文件夹中查找以名称 halide_ 开头的标记为 WEAK 的函数:https ://github.com/halide/Halide/tree/master/src/runtime

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

于 2014-08-22T21:19:19.063 回答