2016-06-03 1 views
2

외부 OpenCL 커널을로드하려고하는데 clCreateKernel이 -46 CL_INVALID_KERNEL_NAME 오류 코드를 반환합니다. 파일 구조는 다음CMake OpenCL : 커널 파일을 읽을 수 없습니다.

. 
├── CMakeLists.txt 
└── src 
    ├── cl.hpp 
    ├── GameOfLife.cpp 
    └── kernels 
     └── programs.cl 

을이, 내 첫 번째 CMake 프로젝트입니다 따라서 나는 다음과 같은 CMake가 올바른지 확실하지 않다 : 다음 함수 호출에 대한

cmake_minimum_required(VERSION 3.5) 
project(gpgpu_gameoflife) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lOpenCL") 

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) 
include_directories(${PROJECT_SOURCE_DIR}/src/kernels) 

# source: http://igorbarbosa.com/articles/how-to-use-opengl-freeglut-and-cmake/ 
######################################################### 
# FIND GLUT 
######################################################### 
find_package(GLUT REQUIRED) 
include_directories(${GLUT_INCLUDE_DIRS}) 
link_directories(${GLUT_LIBRARY_DIRS}) 
add_definitions(${GLUT_DEFINITIONS}) 
if(NOT GLUT_FOUND) 
    message(ERROR " GLUT not found!") 
endif(NOT GLUT_FOUND) 
######################################################### 
# FIND OPENGL 
######################################################### 
find_package(OpenGL REQUIRED) 
include_directories(${OpenGL_INCLUDE_DIRS}) 
link_directories(${OpenGL_LIBRARY_DIRS}) 
add_definitions(${OpenGL_DEFINITIONS}) 
if(NOT OPENGL_FOUND) 
    message(ERROR " OPENGL not found!") 
endif(NOT OPENGL_FOUND) 


set(SOURCE_FILES 
     src/GameOfLife.cpp 
     src/kernels/programs.cl 
     ) 
add_executable(gpgpu_gameoflife ${SOURCE_FILES}) 

target_link_libraries(gpgpu_gameoflife ${OPENGL_LIBRARIES} ${GLUT_LIBRARY}) 

내가 빈 문자열을 얻을 결과적으로 커널 파일을 읽을 수 없다고 생각합니다 (커널 자체는 비어 있지 않습니다).
std::string sourceCode = fileToString("kernels/programs.cl"); 

...

std::string fileToString(const std::string &path) { 
    std::ifstream file(path, std::ios::in | std::ios::binary); 
    if (file) { 
     std::ostringstream contents; 
     contents << file.rdbuf(); 
     file.close(); 
     return (contents.str()); 
    } 
    return ""; 
} 

를 어떻게 외부 커널을로드 CMake를 사용하여 OpenCL을 응용 프로그램을 만드는 방법을 가르쳐 주 시겠어요? 아니면 이것은 좋은 습관이 아닙니까?

감사합니다.

+0

OpenCL 또는 CMake와는 아무런 관련이 없다고 생각합니다. "내 프로그램을 실행할 때의 작업 디렉토리는 내가 생각하는 디렉토리가 아닙니다."라고 생각합니다. OpenCL 기능 테스트를위한 몇 가지 작은 프로그램 (OpenCL 용 드라이버/런타임 구성 요소 작성)과 비슷한 기능을 제공합니다. –

+0

제안 : 빈 문자열을 반환하는 대신''#error 커널 파일을 찾을 수 없습니다 ''- 그런 식으로하면 clCreateKernel 대신 컴파일이 잘못되어 오류가 더 분명해질 것입니다. 또는'return "직전에 어설 션을 추가하십시오;"- 오류를 가능한 한 빨리보고하는 원리. –

+0

@MatsPetersson 네, 감사합니다. 문제는 파일이 복사되지 않았기 때문입니다. 'configure_file '이있는 한 줄로 해결되었습니다. 원본 파일이 자동으로 복사되고 실행 디렉토리와 관련하여 사용 가능할 수 있다고 생각했지만 그렇지 않았습니다. –

답변

1

CMake의 다음 줄이 내 문제를 해결하지만, 나는 여전히 더 나은 해결책을 포함하고있는 다른 대답을 기다리고있다.

configure_file(src/kernels/programs.cl kernels/programs.cl COPYONLY) 
+0

나는 소스 빌드를 할 때만이 기능이 작동한다고 느낀다. 좀 더 일반적인 해결책은'configure_file (src/kernels/programs.cl $ {RUNTIME_OUTPUT_DIRECTORY}/커널/프로그램 .cl COPYONLY)'입니다. https://cmake.org/cmake/help/v3.5/prop_tgt/RUNTIME_OUTPUT_DIRECTORY.html 및 http://stackoverflow.com/a/6595001/2436175를 참조하십시오. – Antonio

+1

@Antonio는'configure_file' 문서에 따라 일반적인 해결책이되어야합니다. "이 상대 경로 인 경우 현재 바이너리 디렉토리와 관련하여 평가됩니다." - https://cmake.org/cmake/help/v3.0/command/configure_file.html –