Ich versuche, einen externen OpenCL-Kernel zu laden und die clCreateKernel
gibt einen Fehlercode zurück: -46 CL_INVALID_KERNEL_NAME
. Die Dateistruktur ist die folgende:CMake OpenCL: Kernel-Datei kann nicht gelesen werden
.
├── CMakeLists.txt
└── src
├── cl.hpp
├── GameOfLife.cpp
└── kernels
└── programs.cl
Dies ist mein erstes CMake Projekt, also bin ich nicht sicher, ob die folgende CMake korrekt ist:
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})
Für den folgenden Funktionsaufruf ich einen leeren String bekommen Daher denke ich, dass die Kernel-Datei nicht zum Lesen verfügbar ist (der Kernel selbst ist nicht leer).
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 "";
}
Können Sie mir bitte sagen, wie eine OpenCL-Anwendung erstellen CMake verwenden, die einen externen Kernel lädt? Oder ist das keine gute Praxis?
Vielen Dank!
Ich erwarte, dass dies nichts mit OpenCL oder CMake zu tun hat und ist das übliche "das Arbeitsverzeichnis, wenn ich mein Programm ausführe, ist nicht das Verzeichnis, das ich denke, es ist". Ich habe eine Funktion, die der in einigen meiner kleinen Programme zum Testen der OpenCL-Funktionalität sehr ähnlich ist (ich arbeite mit dem Schreiben der Treiber/Laufzeitkomponenten für OpenCL). –
Vorschlag: Anstatt eine leere Zeichenfolge zurückzugeben, geben Sie etwas zurück wie '" #fehler Die Kernel-Datei konnte nicht gefunden werden "' - auf diese Weise wird die Kompilierung falsch ausgeführt und nicht der clCreateKernel, und der Fehler wird deutlicher. Oder füge eine Bestätigung an dem Punkt kurz vor deiner Rückkehr hinzu; - das Prinzip, Fehler so schnell wie möglich zu melden und es offensichtlich zu machen. –
@MatsPetersson ja, danke, das Problem war, dass die Datei nicht kopiert wurde. Eine einzelne Zeile mit 'configure_file' löste es. Ich dachte, die Quelldateien würden automatisch kopiert und vielleicht relativ zum Laufverzeichnis verfügbar sein, aber das war es nicht. –