【问题标题】:Halide extern methods卤化物外部方法
【发布时间】:2014-08-22 21:09:10
【问题描述】:

我使用 AOT 编译来使用没有 Halide 库的 Halide 代码。

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

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

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

【问题讨论】:

    标签: c++ halide


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      是的,您可以使用 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_ 开头的符号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        相关资源
        最近更新 更多