Подтвердить что ты не робот

Как связать файл пользовательских объектов с библиотекой Haskell?

Я создал пакет Haskell, который вызывает вызовы FFI для функций, определенных в коде CUDA. Я хотел бы скомпилировать файл .cu в файл объекта (.o) во время сборки пакета и принудительного компоновщика, чтобы связать его.

До сих пор я пытался использовать технику этот вопрос. Я настроил buildHook для:

  • запустить nvcc
  • запустить по умолчанию buildHook
  • создать файл ar библиотеки с помощью скомпилированного кода nvcc.

Setup.hs доступен здесь.

Это решение имеет большой недостаток в ограничении этого пакета статической привязкой. Хотя cabal создает общую библиотеку, он не будет работать, поскольку он не имеет способа разрешать символы, находящиеся в объектном файле.

Есть ли более простой способ связать пользовательский код во время сборки?

4b9b3361

Ответ 1

Я делаю подобное. У меня есть файл Haskell, который вызывает код CUDA.

Вот как я компилирую библиотеки CUDA и связываюсь с Haskell:

$(NVCC) -c -E  $(NVCC_OPTS) -o build/file.i file.cu
$(NVCC) -c  $(NVCC_OPTS) -o build/file.o file.cu

Затем я связываю все в общую библиотеку С++ с именем LibSO с опциями Haskell

$(CXX) -shared -Wl,-rpath=\$$$$ORIGIN $(CXX_LINK_LIBS) $(PACKAGE_RPATH) -Lbuild -rdynamic -L/usr/local/lib/ghc-7.6.3 -lHSrts-ghc7.6.3 -o build/LibSO.so build/file.o

где

CXX_LINK_LIBS = -Lbuild -lcudart -lcuda -lpthread -lcupti -lcurand -lnvidia-ml
NVCC_OPTS = --compiler-options -fPIC -maxrregcount=0 --machine 64 --DCUDA

Затем я беру файлы Haskell и компилирую их в файлы o и hi. (Я компилирую дважды из-за TemplateHaskell)

ghc -v0 -Wall -rtsopts -threaded -stubdir build -ibuild/ -no-hs-main  -o build/iop.o -ohi build/iop.hi -c haskell/iop.lhs
ghc -v0 -Wall -rtsopts -threaded -stubdir build -ibuild/ -no-hs-main  -fPIC -dynamic -osuf dyn_o -hisuf dyn_hi -o build/iop.dyn_o -ohi build/iop.dyn_hi -c haskell/iop.lhs

Итак, теперь у нас есть динамические объекты haskell и общая библиотека С++. В конце концов, я связываю основной файл haskell со всем:

ghc -optl "-Wl,-rpath=\$$ORIGIN" $(CXX_LINK_LIBS) -Lbuild -rtsopts -threaded -lstdc++ -lLibSO -o build/Main build/iop.dyn_o

Есть ли такая помощь?