在我的 CUDA 内核中使用 __shfl_xor 但在编译时出现错误
Using __shfl_xor in my CUDA kernel but getting error when compiling
我试图在我的内核中使用 __shfl_xor,但是当我尝试编译它时,出现错误 "error: identifier "__shfl_xor" is undefined"。我知道您必须设置标志 arch=compute_30,code=sm_30
才能使用它,但我已经在我的 CMakeLists.txt
中添加了它
这是我的内核:
__global__ void dummy_kernel()
{
int x = 5;
int y = 10;
__shfl_xor(x, y);
}
这是编译器的输出:
/filepath/kernel_file.cu(13): error: identifier "__shfl_xor" is undefined
这是我的 CMakeLists.txt 的样子:
cmake_minimum_required(VERSION 3.1)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()
find_package(CUDA REQUIRED)
cuda_add_executable(CasHashing3D
MatchPairGPU.cu
)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -gencode arch=compute_30,code=sm_30")
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -gencode arch=compute_35,code=sm_35")
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD 11)
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD_REQUIRED ON)
configure_file(job.sh.in job.sh @ONLY)
CMake 生成的 makefile 太大,无法粘贴到问题中,所以这里是 a link 文件。
我以某种方式将 CMakeLists.txt 更改为以下内容并且有效,我不知道为什么。一旦我弄清楚我做错了什么,我会更新答案。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -lpthread")
cmake_minimum_required(VERSION 3.2)
project(CasHashing3D)
find_package(CUDA REQUIRED)
# Pass options to NVCC
set(
CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS};
-O3 -gencode arch=compute_35,code=sm_35;
)
cuda_add_executable(CasHashing3D
Main.cc
)
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD 11)
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD_REQUIRED ON)
configure_file(job.sh.in job.sh @ONLY)
您设置为支持__shfl_xor()的CUDA架构35
Fermi GPU 不支持该指令(即架构 20 和 21)
我试图在我的内核中使用 __shfl_xor,但是当我尝试编译它时,出现错误 "error: identifier "__shfl_xor" is undefined"。我知道您必须设置标志 arch=compute_30,code=sm_30
才能使用它,但我已经在我的 CMakeLists.txt
这是我的内核:
__global__ void dummy_kernel()
{
int x = 5;
int y = 10;
__shfl_xor(x, y);
}
这是编译器的输出:
/filepath/kernel_file.cu(13): error: identifier "__shfl_xor" is undefined
这是我的 CMakeLists.txt 的样子:
cmake_minimum_required(VERSION 3.1)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()
find_package(CUDA REQUIRED)
cuda_add_executable(CasHashing3D
MatchPairGPU.cu
)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -gencode arch=compute_30,code=sm_30")
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -gencode arch=compute_35,code=sm_35")
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD 11)
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD_REQUIRED ON)
configure_file(job.sh.in job.sh @ONLY)
CMake 生成的 makefile 太大,无法粘贴到问题中,所以这里是 a link 文件。
我以某种方式将 CMakeLists.txt 更改为以下内容并且有效,我不知道为什么。一旦我弄清楚我做错了什么,我会更新答案。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -lpthread")
cmake_minimum_required(VERSION 3.2)
project(CasHashing3D)
find_package(CUDA REQUIRED)
# Pass options to NVCC
set(
CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS};
-O3 -gencode arch=compute_35,code=sm_35;
)
cuda_add_executable(CasHashing3D
Main.cc
)
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD 11)
set_property(TARGET CasHashing3D PROPERTY CXX_STANDARD_REQUIRED ON)
configure_file(job.sh.in job.sh @ONLY)
您设置为支持__shfl_xor()的CUDA架构35 Fermi GPU 不支持该指令(即架构 20 和 21)