我正在使用一个使用LLVM的JIT.该语言有一个用C++编写的小运行时,我使用clang编译成LLVM IR
clang++ runtime.cu --cuda-gpu-arch=sm_50 -c -emit-llvm
Run Code Online (Sandbox Code Playgroud)
然后加载*.bc文件,生成额外的IR,并动态执行.CUDA的原因是我想在运行时添加一些GPU加速.但是,这会引入CUDA特定的外部函数,这些函数会产生以下错误:
LLVM ERROR: Program used external function 'cudaSetupArgument' which could not be resolved!
Run Code Online (Sandbox Code Playgroud)
正如这里所讨论的,这通常通过在编译程序时包含适当的库来解决:
g++ main.c cmal.o -L/usr/local/cuda/lib64 -lcudart
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何使用LLVM在JITed模块中包含库.我发现这个问题表明以前可以将库添加到JIT中的模块,如下所示:
[your module]->addLibrary("m");
Run Code Online (Sandbox Code Playgroud)
不幸的是,这已被弃用.现在有人能告诉我最好的方法吗?如果我需要提供更多信息,请告诉我们!
此外,我不确定这是否是将GPU卸载合并到我的JIT中的最佳方式,所以如果有人能指出我更好的方法那么请做:)
谢谢!
编辑:我正在使用LLVM 5.0和我正在使用的JIT引擎llvm/ExecutionEngine/ExecutionEngine.h,更具体地说,我创建它像这样:
EngineBuilder EB(std::move(module));
ExecutionEngine *EE = EB.create(targetMachine);
Run Code Online (Sandbox Code Playgroud)
您需要明确地告知您的JIT引擎有关其他符号的信息.
如果他们是在一个动态库(dylib,so,dll),那么你可以叫
sys::DynamicLibrary::LoadLibraryPermanently("path_to_some.dylib")
Run Code Online (Sandbox Code Playgroud)
带有动态库的路径.
如果符号位于目标文件或存档中,则需要更多工作:您需要将它们加载到内存中并添加到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));
Run Code Online (Sandbox Code Playgroud)
对于档案替换模板类型ObjectFile与Archive和呼叫
executionEngine.addArchive(std::move(owningArchive));
Run Code Online (Sandbox Code Playgroud)
在末尾.
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |