외부 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을 응용 프로그램을 만드는 방법을 가르쳐 주 시겠어요? 아니면 이것은 좋은 습관이 아닙니까?
감사합니다.
OpenCL 또는 CMake와는 아무런 관련이 없다고 생각합니다. "내 프로그램을 실행할 때의 작업 디렉토리는 내가 생각하는 디렉토리가 아닙니다."라고 생각합니다. OpenCL 기능 테스트를위한 몇 가지 작은 프로그램 (OpenCL 용 드라이버/런타임 구성 요소 작성)과 비슷한 기능을 제공합니다. –
제안 : 빈 문자열을 반환하는 대신''#error 커널 파일을 찾을 수 없습니다 ''- 그런 식으로하면 clCreateKernel 대신 컴파일이 잘못되어 오류가 더 분명해질 것입니다. 또는'return "직전에 어설 션을 추가하십시오;"- 오류를 가능한 한 빨리보고하는 원리. –
@MatsPetersson 네, 감사합니다. 문제는 파일이 복사되지 않았기 때문입니다. 'configure_file '이있는 한 줄로 해결되었습니다. 원본 파일이 자동으로 복사되고 실행 디렉토리와 관련하여 사용 가능할 수 있다고 생각했지만 그렇지 않았습니다. –