标签: nvlink

针对CUDA静态库链接CUDA代码时出现nvlink错误-CMake

我创建了一个静态库,其中包含一些CUDA代码和一些常规C ++代码。此静态库的CMakeLists.txt如下所示:

SET(TARGET_H some_header.h)
SET(CUDA_SRC cudaclass1.cu cudaclass2.cu)
SET(TARGET_SRC cppclass1.cpp cppclass2.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_LIBRARY(somestatic ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
Run Code Online (Sandbox Code Playgroud)

这将产生libsomestatic.a

现在,我想将此静态库与可执行文件链接,该可执行文件本身由CUDA代码和C ++代码组成。

在这个可执行文件的CUDA代码,我需要实例化并使用CudaClass1libsomestatic.a

这是CMakeLists.txt可执行文件:

SET(TARGET_H some_header.h)
SET(CUDA_SRC cudafile.cu)
SET(TARGET_SRC main.cpp)
SET(CUDA_NVCC_FLAGS "")
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_EXECUTABLE(some_exe ${TARGET_H} ${TARGET_SRC} ${CUDA_SRC} OPTIONS -arch sm_20)
TARGET_LINK_LIBRARIES(some_exe somestatic)
Run Code Online (Sandbox Code Playgroud)

但是在构建时出现以下错误:

nvlink error: Undefined reference to '_ZN10test7CudaClass1C1EPKNS_11intE' in ...
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 有可能完全做到这一点吗?将CUDA代码链接到包含CUDA代码的库?
  2. 如果是,我将如何使用CMake做到这一点?

CUDA文档说明(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#examples

“可以在单个主机可执行文件中进行多个设备链接,只要每个设备链接彼此独立(它们不能跨设备可执行文件共享代码)”

听起来我无法做我想做的事,对吧?

我使用CUDA 5.5和GCC 4.8。

c++ cuda cmake nvcc nvlink

5
推荐指数
0
解决办法
1369
查看次数

无法解密nvlink错误

我正在尝试用它来构建一个项目nvcc.我收到了nvlink error:我见过的最令人烦恼的消息.

这是链接声明:

nvcc    -rdc=true -arch=sm_21 -O3 -Xcompiler -fPIC -I"/usr/local/ACE_wrappers" -I"/usr/local/ACE_wrappers/TAO" -I"/usr/local/DDS" -I"/usr/include/Qt" -I"/usr/include/QtCore" -I"/usr/include/QtGui" -I"../../include" -I"../../include/DDS" -I"../../include/CoordinateTransforms" -I"../../include/DDS/IDLBrokerTemplates" -I"../../def/IDL" -I"../../def/CMD" -I"../../def/XSD" -I"../../src/NetAcquire" -I"/usr/local/ACE_wrappers/TAO/orbsvcs" -I"/usr/local/include/lct.7.5.4" -L"." -L"/usr/local/ACE_wrappers/lib" -L"/usr/local/DDS/lib" -L"/usr/lib64" -L"/usr/local/lib64" -L"../../def/IDL/lib" -L"../../def/XSD" -L"/usr/local/lib" .obj/../../src/Component.o .obj/../../src/COM.o .obj/../../src/DDS/EntityManager.o .obj/../../src/IDLBrokerTemplates/CommandManager.o .obj/../../src/IDLBrokerTemplates/OptionManager.o .obj/../../include/ApplicationProcessStateReporter_moc.o .obj/../../src/Application.o .obj/../../src/CoordinateTransforms/Site.o .obj/../../src/CoordinateTransforms/Geodesy.o .obj/../../src/CoordinateTransforms/Earth.o .obj/../../src/CoordinateTransforms/StateVector.o .obj/../../src/CoordinateTransforms/KeplerianImpact.o .obj/../../src/CoordinateTransforms/GeodeticPosition.o .obj/../../src/IDLBrokerTemplates/MeasurandSubscription.o .obj/../../src/NetAcquire/NetAcquire.o .obj/DataLossFlightTimeImpl.o .obj/DataLossFlightTime.o .obj/DftTable.o .obj/OptionListener.o .obj/PrimaryListener.o .obj/MissionTimeListener.o .obj/DeadMan.o .obj/main.o .obj/../../src/XML/spline.o .obj/../../src/XML/FpTable.o -l"naps-x86_64" -l"naio-x86_64" -l"nalct-x86_64" -l"curl" -l"TAO_Messaging" -l"TAO_Valuetype" -l"TAO_PI_Server" -l"TAO_PI" -l"TAO_CodecFactory" -l"TAO_CosNaming" -l"armadillo" -l"boost_filesystem" -l"boost_system" -l"xerces-c" -l"jarssXSD" -l"OpenDDS_Tcp" -l"JARSSRTv10" -l"QtNetwork" …
Run Code Online (Sandbox Code Playgroud)

cuda nvcc nvlink

0
推荐指数
1
解决办法
1507
查看次数

cudaMemcpyAsync奇怪的行为:1.cudaMemcpyKind没什么区别.2.复制失败,但是默默无闻

我熟悉一个配备Pascal P100 GPU + Nvlink的新集群.我写了一个ping-pong程序来测试gpu < - > gpu和gpu < - > cpu带宽和点对点访问.(我知道cuda样本包含这样的程序,但我想自己做以便更好地理解.)Nvlink带宽看似合理(双向约35 GB/s,理论最大值为40).然而,在调试乒乓球时,我发现了一些奇怪的行为.

首先,无论我指定什么cudaMemcpyKind,cudaMemcpyAsync都会成功,例如,如果cudaMemcpyAsync正在将内存从主机复制到设备,即使我将cudaMemcpyDeviceToHost作为类型传递,它也会成功.

其次,当主机内存没有页面锁定时,cudaMemcpyAsync会执行以下操作:

  • 将内存从主机复制到设备似乎成功(没有segfaults或cuda运行时错误,数据似乎正确传输).
  • 将内存从设备复制到主机会无声地失败:没有发生段错误,并且memcpy返回cudaSuccess后cudaDeviceSynchronize,但检查数据显示gpu上的数据没有正确传输到主机.

这种行为是期待的吗?我已经包含了一个在我的系统上演示它的最小工作示例代码(示例不是乒乓应用程序,它所做的只是使用各种参数测试cudaMemcpyAsync).

P100s启用了UVA,因此cudaMemcpyAsync简单地推断src和dst指针的位置并忽略cudaMemcpyKind参数是合理的.但是,我不确定为什么cudaMemcpyAsync无法为非页面锁定的主机内存引发错误.我的印象是严格的禁忌.

#include <stdio.h>
#include <cuda_runtime.h>
#include <stdlib.h>

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
   if (code != cudaSuccess)
   {
      fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
      if (abort) exit(code);
   }
}

__global__ void checkDataDevice( int* current, int* next, int expected_current_val, int n )
{
  int tid = threadIdx.x + …
Run Code Online (Sandbox Code Playgroud)

cuda nvlink uva

0
推荐指数
1
解决办法
674
查看次数

标签 统计

cuda ×3

nvlink ×3

nvcc ×2

c++ ×1

cmake ×1

uva ×1