我是Linux的新手(使用Ubuntu 14.04 LTS 64bit),来自Windows,我正试图移植我现有的CUDA项目.
通过链接时
/usr/local/cuda/bin/nvcc -arch=compute_30 -code=sm_30,compute_30 -o Main.o Display.o FileUtil.o Timer.o NeuralNetwork.o -L/usr/lib -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu -L/usr/local/cuda/lib64 -lGLEW -lglfw3 -lGL -lGLU -lcuda -lcudart
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_clipboard.c.o): undefined reference to symbol 'XConvertSelection'
//usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [CUDANN] Error 1
Run Code Online (Sandbox Code Playgroud)
答案似乎与本文中的解决方案密切相关(奇怪的链接错误:DSO从命令行中丢失),但鉴于我对Linux的经验不足,我无法使它们适应我自己的问题.
关于问题可能是什么的任何想法?
以下是编译期间的完整输出:https://gist.github.com/wbolden/857eddd11e4dcb915c02
这是我对Makefile的尝试:https: //gist.github.com/wbolden/135033daae04ed0d8cf3
是否有我可以使用的CUDA的#define编译器(nvcc)宏?(如_WIN32 for Windows等.)
我需要这个头文件代码,这在nvcc和VC++编译器之间是常见的.我知道我可以继续定义我自己的并将其作为参数传递给nvcc编译器(-D),但是如果已经定义了它会很好.
我目前正在编写一个CUDA应用程序,并希望使用boost :: program_options库来获取所需的参数和用户输入.
我遇到的麻烦是NVCC无法处理编译提升文件的any.hpp错误,例如
1>C:\boost_1_47_0\boost/any.hpp(68): error C3857: 'boost::any': multiple template parameter lists are not allowed
Run Code Online (Sandbox Code Playgroud)
我在网上搜索并发现这是因为NVCC 无法处理boost代码中使用的某些结构,但是NVCC应该将主机代码的编译委托给C++编译器.在我的情况下,我使用的是Visual Studio 2010,因此应该传递主机代码cl.
由于NVCC似乎变得困惑,我甚至围绕增强内容编写了一个简单的包装器并将其粘贴在一个单独的.cpp(而不是.cu)文件中,但我仍然遇到构建错误.很奇怪错误是在编译我main.cu而不是wrapper.cpp但仍然是由boost引起的,即使main.cu不包括任何增强代码.
有没有人知道这个问题的解决方案甚至解决方法?
我使用CUDA 4.0 arch.,带有Compute_Capability 2.0设备(GTX460).'cubin'和'ptx'文件有什么区别?我认为cubin是gpu的本机代码,所以这是拱门.具体而言,ptx是一种通过JIT编译在Fermi设备(例如Geforce GTX 460)上运行的中间语言.当我编译cu源时,我可以在ptx或cubin目标之间进行选择.如果我想要cubin文件,我选择"code = sm_20".但如果我想要一个ptx文件,我会使用"code = compute_20".这是对的吗?
我正在尝试修改用C编写的GPL程序.我的目标是用CUDA实现替换一个方法,这意味着我需要用nvcc而不是gcc编译.我需要帮助构建项目 - 不实现它(你不需要了解CUDA C的任何帮助,我不认为).
这是我第一次尝试更改涉及.configure和Makefile的中等复杂度的C项目.老实说,这是我第一次在C中做很长时间的事情,包括gcc或g ++的任何事情,所以我很丢失.
我对学习configure和Makefiles并不感兴趣 - 这更像是一个实验.我想在花费时间创建正确的构建脚本之前看看项目实现是否顺利.(并不是不愿意在必要时学习,只是试图了解范围).
话虽如此,我有什么选择来构建这个项目?我有很多问题......
我尝试在AC_PROG_CC之后将"CC = nvcc"添加到configure.in文件中.这似乎工作 - 从运行configure和make输出显示nvcc作为编译器.但是,无法使用CUDA内核编译源文件,而无法识别CUDA特定语法.我不知道为什么,希望这会有效.
是否可以使用nvcc编译源文件,然后将其包含在主程序的make过程的链接步骤中?如果是这样,怎么样?(这个问题可能没有意义 - 我真的生气了)
这样做的正确方法是什么?
我可以使用快速而肮脏的方式进行测试吗?
每个人都使用一些秘密工具来设置和理解这些配置和Makefile吗?这比我习惯的Apache Ant脚本更糟糕(是的,我不在我的境界)
编译CUDA代码时,必须选择生成代码的架构.nvcc提供了两个参数来指定这种架构,基本上:
arch指定虚拟arquictecture,其可以是compute_10,compute_11等code指定真实结构,其可以是sm_10,sm_11等所以这样的命令:
nvcc x.cu -arch=compute_13 -code=sm_13
Run Code Online (Sandbox Code Playgroud)
将为具有1.3计算能力的设备生成"cubin"代码.如果我错了,请纠正我.我想知道这两个参数的默认值是什么?这是默认的架构,没有值时NVCC使用 arch 或 code 规定的?
目标:
test为共享库创建可执行文件.问题
MYLIB.so似乎编译得很好.(没问题)../libMYLIB.so: undefined reference to __cudaRegisterLinkedBinary_39_tmpxft_000018cf_00000000_6_MYLIB_cpp1_ii_74c599a1
简化的makefile:
libMYlib.so : MYLIB.o
g++ -shared -Wl,-soname,libMYLIB.so -o libMYLIB.so MYLIB.o -L/the/cuda/lib/dir -lcudart
MYLIB.o : MYLIB.cu MYLIB.h
nvcc -m64 -arch=sm_20 -dc -Xcompiler '-fPIC' MYLIB.cu -o MYLIB.o -L/the/cuda/lib/dir -lcudart
test : test.cpp libMYlib.so
g++ test.cpp -o test -L. -ldl -Wl,-rpath,. -lMYLIB -L/the/cuda/lib/dir -lcudart
Run Code Online (Sandbox Code Playgroud)
确实
nm libMYLIB.so 显示所有 CUDA api函数都是"未定义的符号":
U __cudaRegisterFunction
U __cudaRegisterLinkedBinary_39_tmpxft_0000598c_00000000_6_CUPA_cpp1_ii_74c599a1
U cudaEventRecord
U cudaFree
U cudaGetDevice
U cudaGetDeviceProperties
U cudaGetErrorString
U cudaLaunch
U cudaMalloc …Run Code Online (Sandbox Code Playgroud) 使用C或C++编译器时,如果我们通过-O3交换机,执行会变得更快.在CUDA中,有没有相同的东西?
我正在使用该命令编译我的代码nvcc filename.cu.之后我执行./a.out.
我正在测试新的CUDA 8以及Pascal Titan X GPU,并期待我的代码加速,但由于某种原因它最终会变慢.我在Ubuntu 16.04上.
以下是可以重现结果的最小代码:
CUDASample.cuh
class CUDASample{
public:
void AddOneToVector(std::vector<int> &in);
};
Run Code Online (Sandbox Code Playgroud)
CUDASample.cu
__global__ static void CUDAKernelAddOneToVector(int *data)
{
const int x = blockIdx.x * blockDim.x + threadIdx.x;
const int y = blockIdx.y * blockDim.y + threadIdx.y;
const int mx = gridDim.x * blockDim.x;
data[y * mx + x] = data[y * mx + x] + 1.0f;
}
void CUDASample::AddOneToVector(std::vector<int> &in){
int *data;
cudaMallocManaged(reinterpret_cast<void **>(&data),
in.size() * sizeof(int),
cudaMemAttachGlobal);
for (std::size_t i = 0; i < in.size(); …Run Code Online (Sandbox Code Playgroud) 我需要从命令行使用nvcc编译cuda .cu文件.该文件是"vectorAdd_kernel.cu"并包含以下代码:
extern "C" __global__ void VecAdd_kernel(const float* A, const float* B, float* C, int N)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < N)
C[i] = A[i] + B[i];
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令(我需要获取.cubin文件):
nvcc --cubin --use-local-env --cl-version 2010 -keep -I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include" vectorAdd_kernel.cu
Run Code Online (Sandbox Code Playgroud)
编译器创建文件vectorAdd_kernel.cpp4.ii和vectorAdd_kernel.cpp1.ii然后它使用以下输出停止:
C:\Users\Massimo\Desktop\Pluto>nvcc --cubin --use-local-env --cl-version 2010 vectorAdd_kernel.cu -keep -I "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include"
vectorAdd_kernel.cu
vectorAdd_kernel.cu
c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(29): error: invalid redeclaration of type name "size_t" …Run Code Online (Sandbox Code Playgroud)