首页 > 解决方案 > CMake 和 CUDA 的权限错误

问题描述

我正在尝试使用 CUDA 和 C++ 代码构建一个带有静态库的项目。它需要与外部库(moderngpu)链接。CUDA 和 C++ 代码各自独立运行良好,并且之前已使用 make 编译过。但是,当尝试使用 CMake 构建代码时(通过 CLion,如果重要的话),我收到以下错误:

Error running 'main': Cannot run program "/home/mnemonic/Programs/myProject/bin/src/CMakeFiles/hvm.dir/cmake_device_link.o" (in directory "/home/mnemonic/Programs/myProject/bin/src/CMakeFiles/hvm.dir"): error=13, Permission denied

几天来我一直在尝试解决这个问题,但一直没有取得任何进展。我得到一个权限错误是没有意义的,.o当我将它设置为可执行文件时,它抱怨的文件没有运行。我最好的猜测是这是某种链接问题。任何帮助,将不胜感激。

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.9 FATAL_ERROR)
PROJECT(myProject LANGUAGES CXX CUDA)

FIND_PACKAGE(CUDA 8.0 REQUIRED)

SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
-Wall -Wextra -Wno-deprecated -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op \
-Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual -Wpedantic \
-ffast-math \
")
SET(CMAKE_CUDA_COMPILER /usr/local/cuda-8.0/bin/nvcc)
SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} \
    -Xcompiler -pthread,-fno-strict-aliasing,-g,-O2,-g,-fwrapv,-O3,-Wall,-fPIC \
    -gencode arch=compute_61,code=sm_61 \
")

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(lib)

src/CMakeLists.txt

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} source)

ADD_EXECUTABLE(stuff ${source})

TARGET_LINK_LIBRARIES(stuff LINK_PUBLIC thing thingKernels)

lib/CMakeLists.txt

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(
    /usr/local/src/moderngpu/include
    /usr/local/cuda-8.0/include
)

ADD_LIBRARY(thing STATIC
    ${CMAKE_CURRENT_SOURCE_DIR}/thing.cpp
)

ADD_LIBRARY(thingKernels STATIC
    ../include/cuda/thing.cu
    /usr/local/src/moderngpu/src/mgpucontext.cu
    /usr/local/src/moderngpu/src/mgpuutil.cpp
)

TARGET_INCLUDE_DIRECTORIES(thing PUBLIC ../include ${CMAKE_CURRENT_SOURCE_DIR})
TARGET_INCLUDE_DIRECTORIES(thingKernels PUBLIC ../include ${CMAKE_CURRENT_SOURCE_DIR})

作为参考,这是工作Makefile

ifndef CUDA_VERSION
    CUDA_VERSION = 8.0
endif
ifndef COMPUTE_CAPABILITY
    COMPUTE_CAPABILITY = 61
endif

CPP_COMPILER = g++
CPP_FLAGS = -pthread -fno-strict-aliasing -g -O2 -g -fwrapv -O3 -Wall -fPIC

CUDA_COMPILER = nvcc -m64
CUDA_FLAGS = -Xcompiler -pthread,-fno-strict-aliasing,-g,-O2,-g,-fwrapv,-O3,-Wall,-fPIC
CUDA_FLAGS += -gencode arch=compute_$(COMPUTE_CAPABILITY),code=sm_$(COMPUTE_CAPABILITY)

CUDA_INCLUDE = /usr/local/cuda-$(CUDA_VERSION)/include
MGPU_INCLUDE = /usr/local/src/moderngpu/include
INCLUDE_FLAGS = -I$(CUDA_INCLUDE) -I$(MGPU_INCLUDE)

CUDA_LIB = /usr/local/cuda-$(CUDA_VERSION)/lib64
LINK_FLAGS = -L$(CUDA_LIB)

MGPU_SRC = /usr/local/src/moderngpu/src

TARGETS = thing

all: $(TARGETS)

thing: thing.co | mgpuutil.o mgpucontext.o
    $(CPP_COMPILER) $(CPP_FLAGS) $< $(LINK_FLAGS) -lcudart -o $@ $|

%.co: %.cu
    $(CUDA_COMPILER) $(CUDA_FLAGS) $(INCLUDE_FLAGS) $(LINK_FLAGS) -o $@ -c $<

mgpucontext.o:  $(MGPU_SRC)/mgpucontext.cu
    $(CUDA_COMPILER) $(CUDA_ARGS) $(INCLUDE_FLAGS) -o $@ -c $<

mgpuutil.o:  $(MGPU_SRC)/mgpuutil.cpp
    $(CUDA_COMPILER) $(CUDA_ARGS) $(INCLUDE_FLAGS) -o $@ -c $<

clean:
    rm -f *.o *.co $(TARGETS)

标签: c++cmakecuda

解决方案


我编写了插件CLion CUDA Run Patcher来为 CLion 中的这个错误提供临时修复,直到 JetBrains 提供了CPP-10292中跟踪的正确修复。

该插件是必要的,因为 CLion 忽略了 CMake 中的任何目标名称,包括由 target property 指定的名称OUTPUT_NAME

在CPP-866中跟踪的 CLion 完全支持 CUDA 之前,这个问题很可能不会得到解决。


推荐阅读