代码之家  ›  专栏  ›  技术社区  ›  James Allingham

llvm JIT将库添加到模块

  •  8
  • James Allingham  · 技术社区  · 6 年前

    我正在研究使用LLVM的JIT。该语言有一个用C++编写的小运行时,我使用clang将其编译为LLVM IR

    clang++ runtime.cu --cuda-gpu-arch=sm_50 -c -emit-llvm
    

    然后加载*。bc文件,生成额外的IR,并动态执行。CUDA的原因是我想在运行时添加一些GPU加速。然而,这引入了CUDA特定的外部功能,会产生以下错误:

    LLVM ERROR: Program used external function 'cudaSetupArgument' which could not be resolved!
    

    如前所述 here ,这通常通过在编译程序时包含适当的库来解决:

    g++ main.c cmal.o -L/usr/local/cuda/lib64 -lcudart 
    

    然而,我不知道如何使用LLVM在JITed模块中包含库。我发现 this 问题表明,可以将库添加到JIT中的模块中,如下所示:

    [your module]->addLibrary("m");
    

    不幸的是,这已被弃用。现在谁能告诉我最好的方法吗?如果我需要提供更多信息,请告诉我!

    此外,我不确定这是否是将GPU卸载纳入我的JIT的最佳方式,因此,如果有人能给我指出更好的方法,请告诉我:)

    谢谢

    编辑:我使用的是LLVM 5.0,我使用的JIT引擎来自 llvm/ExecutionEngine/ExecutionEngine.h ,更具体地说,我是这样创建的:

    EngineBuilder EB(std::move(module));
    ExecutionEngine *EE = EB.create(targetMachine);
    
    1 回复  |  直到 6 年前
        1
  •  11
  •   AlexDenisov    6 年前

    您需要明确地将其他符号告知JIT引擎。

    如果它们位于动态库中( dylib , so , dll )那你可以打电话

    sys::DynamicLibrary::LoadLibraryPermanently("path_to_some.dylib")
    

    具有指向动态库的路径。

    如果符号位于对象文件或归档文件中,则需要做更多的工作:您需要将它们加载到内存中并添加到 ExecutionEngine 使用其API。

    以下是对象文件的示例:

    std::string objectFileName("some_object_file.o");
    
    ErrorOr<std::unique_ptr<MemoryBuffer>> buffer =
      MemoryBuffer::getFile(objectFileName.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()));
    
    executionEngine.addObjectFile(std::move(owningObject));
    

    对于存档替换模板类型 ObjectFile 具有 Archive ,并呼叫

    executionEngine.addArchive(std::move(owningArchive));
    

    最后。