gpt4 book ai didi

LLVM JIT 支持缓存编译输出

转载 作者:行者123 更新时间:2023-12-03 23:55:49 26 4
gpt4 key购买 nike

我试图了解如何避免每次都进行 LLVM JIT 编译并使用缓存副本。我看到 LLVM 有 ObjectCache支持从模块生成代码,但是要从文件或代码字符串中获取模块,需要对其进行编译并经过不同的优化 channel 。最好的方法是什么?

  • 将最终的图像对象缓存到某个文件并首先查找该文件,然后尝试解析并尝试创建ExecutionEngine与图像一起执行(获取函数指针并调用它)
  • 保存代码编译和优化的中间输出 - 即将模块写入某个文件(例如,使用转储)并尝试读取它(解析 IR)。然后使用 ObjectCache支持从此模块生成代码。

  • 选项(2)似乎是两个步骤,可能比(1)更糟糕,但(1)是正确的方法吗?

    最佳答案

    假设您有 ObjectFile 的实例您可以将其写入磁盘:

    std::string cacheName("some_name.o");
    std::error_code EC;
    raw_fd_ostream outfile(cacheName, EC, sys::fs::F_None);
    outfile.write(object.getBinary()->getMemoryBufferRef().getBufferStart(),
    object.getBinary()->getMemoryBufferRef().getBufferSize());
    outfile.close();

    然后你可以从磁盘读回它:
    std::string cacheName("some_name.o");

    ErrorOr<std::unique_ptr<MemoryBuffer>> buffer =
    MemoryBuffer::getFile(cacheName.c_str());

    if (!buffer) {
    // handle error
    }

    Expected<std::unique_ptr<ObjectFile>> objectOrError =
    ObjectFile::createObjectFile(buffer.get()->getMemBufferRef());

    if (!objectOrError) {
    // handle error
    }

    std::unique_ptr<ObjectFile> objectFile(std::move(objectOrError.get()));

    auto owningObject = OwningBinary<ObjectFile>(std::move(objectFile),
    std::move(buffer.get()));
    auto object = owningObject.getBinary();

    您可以使用此代码并将其插入您的自定义 ObjectCache ,然后将对象缓存提供给 JIT 引擎。

    我希望它有所帮助。

    关于LLVM JIT 支持缓存编译输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48077883/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com