C++ 卤化物外置法

C++ 卤化物外置法,c++,halide,C++,Halide,我使用AOT编译来使用没有卤化物库的卤化物代码 我在HalideRuntime.h(源代码中提供)中看到,在我的.o文件中有许多可用的外部方法 卤素电池和卤素电池是非常有趣的。我已经将halide_copy_使用到了_dev,没有问题,但是我看到我的内存被分配了。 如果我想在主机和设备之间做一个简单的memcpy并使用halide_dev_malloc,这可能吗 HalideRuntime.h是否对所有可用的外部函数进行了分组,或者对象文件包含许多其他函数 Jay是的,您可以使用halide_d

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

我在HalideRuntime.h(源代码中提供)中看到,在我的.o文件中有许多可用的外部方法

卤素电池和卤素电池是非常有趣的。我已经将halide_copy_使用到了_dev,没有问题,但是我看到我的内存被分配了。 如果我想在主机和设备之间做一个简单的memcpy并使用halide_dev_malloc,这可能吗

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


Jay

是的,您可以使用halide_dev_malloc手动复制内容。请参见第466行,了解卤化物复制到设备的实际功能

首先它做了一个卤化物开发,然后使用cuda的cuMemcpyHtoD。如果缓冲区在内存中不是密集的,那么会有一堆额外的逻辑,但大多数情况下,它会变成一个cuMemcpyHtoD

我相信HalideRuntime.h包含所有有用的外部函数。还有一些其他的内部元素,比如卤化物,创造出一个有趣的背景。要查看所有这些函数,请在此文件夹中查找以名称halide_uu开头的标记为弱的函数:


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

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

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

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