是否可以将带有nvcc的GPU编译(C++)代码转换为共享对象(.so文件)并从C++程序动态加载它(在本例中,Cern的ROOT,它本质上是一个C++解释器("CINT")) ).
我想要运行的一个简单示例是:
extern "C"
void TestCompiled() {
printf("test\n");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
这段代码是用nvcc --compiler-options '-fPIC' -o TestCompiled_C.so --shared TestCompiled.cu.编译的.使用以下命令将共享对象加载到ROOT:
{ // Test.C program
int error, check;
check = gROOT->LoadMacro("TestCompiled_C.so", &error);
cout << "check " << check << " " << " error: " << error << endl;
TestCompiled(); // run macro
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
加载库好,但找不到TestCompiled():
$ root -b -l Test.C
root [0]
Processing Test.C...
check 0 error: 0
Error: Function Hello() is not defined …Run Code Online (Sandbox Code Playgroud) 我们一直在linux中开发代码,但是想编译一个windows可执行文件.旧的非gpu版本与windows中的mingw编译得很好,所以我希望我能够用CUDA版本做同样的事情.
策略是在visual studio中使用nvcc编译内核代码,其余部分在mingw中使用gcc编译.
到目前为止,我们在visual studio中轻松编译了.cu文件(内核和内核启动).但是,我们仍然无法在mingw中编译c代码.c代码包含cuda api调用,例如cudaMalloccuda类型cudaEvent_t,因此我们必须包括cuda.h和cuda_runtime.h.但是,gcc会为这些标头提供警告和错误,例如:
../include/host_defines.h:57:0: warning: "__cdecl" redefined
Run Code Online (Sandbox Code Playgroud)
和
../include/vector_functions.h:127:14: error: 'short_4' has no member named 'x'
Run Code Online (Sandbox Code Playgroud)
关于如何包含这些头文件并编译代码的c部分的任何想法?
根据NVIDIA网站:
"CUDA工具包补充并完全支持使用OpenACC指令进行编程."
这是否意味着可以使用编译nvcc器编译OpenACC程序(pargma和API)?或者它意味着只支持运行时例程调用?
不幸的是,我现在无法安装CUDA Toolkit 5.0来获得我的答案.谢谢!
好吧,我有一个非常令人不安的CUDA 5.0问题,关于如何正确地链接事物.我真的很感激任何帮助!
使用CUDA 5.0的可分离编译功能,我生成了一个静态库(*.a).当通过nvcc运行时,这与其他*.cu文件很好地链接,我已经多次这样做了.
我现在想要获取一个*.cpp文件,并使用g ++或其他方法将其链接到此静态库中的主机代码,但不是nvcc.如果我尝试这个,我会遇到编译错误
对__cudaRegisterLinkedBinary的未定义引用
我正在使用两者-lcuda并且据-lcudart我所知,库的顺序正确(含义-lmylib -lcuda -lcudart).我不认为这是一个问题.也许我错了,但我觉得我错过了一步,我需要对我的静态库(设备链接?)做一些其他事情才能使用g ++.
我错过了至关重要的事吗?这甚至可能吗?
奖金问题:我希望最终结果是一个动态库.我怎样才能做到这一点?
我想nvcc -ptx从Windows命令行使用,但我总是收到此错误消息:nvcc:致命错误:无法找到Microsoft Visual Studio配置文件'vcvars64.bat'安装在'C:\ Program Files(x86)\ Microsoft Visual S tudio 11.0\VC\bin /../ ..'
我正在使用vs 2012快递版.什么可以解决方案?
操作系统:Ubuntu 14.04LTS
语言:Python Anaconda 2.7(keras,theano)
GPU:GTX980Ti CUDA:CUDA 7.5
我想通过使用我的GPU(GTX980Ti)在IPython Notebook上运行keras python代码
但是我找不到它.
我想测试下面的代码.当我把它运行到Ubuntu终端时,我命令如下(它使用GPU很好.它没有任何问题)
首先,我设置如下的路径
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
其次,我运行如下代码
THEANO_FLAGS='floatX=float32,device=gpu0,nvcc.fastmath=True' python myscript.py
Run Code Online (Sandbox Code Playgroud)
它运行良好.
但是当我在pycharm(python IDE)上运行代码或者当我在Ipython Notebook上运行它时,它不使用gpu.它只使用CPU
myscript.py代码如下.
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
vlen = 10 * 30 * 768 # 10 x #cores x # threads per core
iters = 1000
rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in xrange(iters): …Run Code Online (Sandbox Code Playgroud) 我尝试卸载 CUDA 10 并安装 9.2。现在nvcc -V返回 9.2,但显示nvidia-smiCUDA 10.0。
知道为什么会发生这种情况或如何解决吗?在我的系统上找不到与 10.0 相关的任何其他内容。
编辑:添加了截图作为对 nvidia 员工的回复,显示nvidia-smi清楚地说明了 CUDA 版本..
我正在尝试使用库std::countr_zero()中的函数<bitset>,但我不确定应该如何配置我的 nvcc 编译器,因为我确定它没有使用 C++20 版本。
我正在构建一个需要nvcc编译的软件.我没有支持CUDA的GPU,但实际上我并不需要它 - 朋友正在Linux上构建完全相同的软件,他没有CUDA GPU,但一切都很好.
我从https://developer.nvidia.com/cuda-downloads(cuda_6.5.14_mac_64.pkg)安装了最新的CUDA工具包,没有任何问题.但是当我构建软件时,我遇到了问题.
我能够以较小的规模重现这个问题:
$ mkdir temp; cd temp; cabal sandbox init
$ cabal get cuda
Unpacking to cuda-0.6.5.0/
$ cd cuda-0.6.5.0/Foreign/CUDA/Analysis
$ c2hs -d trace --cpp=/Developer/NVIDIA/CUDA-6.5/bin/nvcc --cppopts=-ccbin --cppopts=/usr/bin/clang --cppopts=-Xcompiler --cppopts=--stdlib=libstdc++ Device.chs
Attempting to read file `Device.chs'...
...parsing `Device'...
...successfully loaded `Device'.
Invoking cpp as `/Developer/NVIDIA/CUDA-6.5/bin/nvcc -E -x c -ccbin /usr/bin/clang -Xcompiler --stdlib=libstdc++ -U__BLOCKS__ -DC2HS_MIN_VERSION(mj,mn,rv)=(mj<=0&&mn<=18&&rv<=2) Device.chs.h'...
In file included from <built-in>:170:
<command line>:3:29: error: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译一些 CUDA,并且希望显示编译器警告。相当于:
g++ fish.cpp -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)
除了 NVCC 不理解这些,你必须通过它们:
nvcc fish.cu --compiler-options -Wall --compiler-options -Wextra
nvcc fish.cu --compiler-options "-Wall -Wextra"
Run Code Online (Sandbox Code Playgroud)
(我喜欢后一种形式,但最终,这并不重要。)
鉴于此 CMakeLists.txt (一个非常精简的示例):
cmake_minimum_required(VERSION 3.9)
project(test_project LANGUAGES CUDA CXX)
list(APPEND cxx_warning_flags "-Wall" "-Wextra") # ... maybe others
add_compile_options("$<$<COMPILE_LANGUAGE:CUDA>:--compiler-options ${cxx_warning_flags}>")
add_executable(test_cuda fish.cu)
Run Code Online (Sandbox Code Playgroud)
但这扩展到:
nvcc "--compiler-options -Wall" -Wextra ...
Run Code Online (Sandbox Code Playgroud)
这显然是错误的。(省略生成器表达式周围的引号只会让我们陷入破碎的扩展地狱。)
...跳过蒙特卡洛编程的数千次迭代...
我已经到达了这个宝石:
set( temp ${cxx_warning_flags} )
string (REPLACE ";" " " temp "${temp}")
set( temp2 "--compiler-options \"${temp}\"" )
message( "${temp2}" )
Run Code Online (Sandbox Code Playgroud)
打印出看起来令人鼓舞的
--compiler-options "-Wall -Wextra"
Run Code Online (Sandbox Code Playgroud)
但是之后
add_compile_options("$<$<COMPILE_LANGUAGE:CUDA>:${temp2}>")
Run Code Online (Sandbox Code Playgroud)
扩展到:
nvcc "--compiler-options \"-Wall …Run Code Online (Sandbox Code Playgroud)