2017-02-02 5 views
0

J'essaie d'utiliser __shfl_xor dans mon noyau mais quand j'essaie de le compiler, j'obtiens l'erreur "error: l'identificateur" __shfl_xor "est indéfini". Je suis conscient que vous devez définir le drapeau arch=compute_30,code=sm_30 pour l'utiliser, mais je l'ai déjà ajouté que dans mon CMakeLists.txtUtiliser __shfl_xor dans mon noyau CUDA mais obtenir une erreur lors de la compilation

Voici mon noyau:

__global__ void dummy_kernel() 
{ 
    int x = 5; 
    int y = 10; 
    __shfl_xor(x, y); 
} 

est ici la sortie du compilateur:

/filepath/kernel_file.cu(13): error: identifier "__shfl_xor" is undefined 

Voici ce que mon CMakeLists.txt ressemble:

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) 

Le Le fichier makefile généré par CMake est trop volumineux pour être collé dans la question, alors voici a link dans le fichier.

+1

À quoi ressemble la version complète de 'CUDA_NVCC_FLAGS'? Vous ajoutez à eux, mais probablement vous avez déjà une architecture là-bas qui ne supporte pas les shuffle intrinsèques. – tera

+0

@tera J'ai Tesla K20Xm qui est 3.5 donc ça devrait aller. 3 ou plus est requis. CMakeLists.txt définit 'CUDA_NVCC_FLAGS' à la valeur' -gencode arch = compute_30, code = sm_30'. – Rabee

+0

@talonmies J'ai édité la réponse pour inclure un noyau simple et aussi l'erreur du compilateur. – Rabee

Répondre

1

D'une façon ou d'une autre, j'ai changé mon CMakeLists.txt à ce qui suit et cela a fonctionné, je n'ai aucune idée pourquoi. Je mettrai à jour la réponse une fois que je découvrirai ce que je faisais mal.

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)