GCC linkt zu 32bit OpenCL anstatt zu 64bit OpenCL

Hallo,

ich versuche gerade auf meinem neuen Laptop meinen selbst geschriebenen OpenCL Code zu kompilieren. Der letzte Befehl des Make files endet jedoch mit:

*g++ -o wholeRunGPU main_GPU.o IsingSpins_2d_initClass.o IsingSpins_2d_CPU.o IsingAtom.o IsingSpins_2d_GPU.o -lboost_system -lboost_filesystem -lOpenCL -o w
holeRunGPU
/usr/lib64/gcc/x86_64-suse-linux/11/…/…/…/…/x86_64-suse-linux/bin/ld: skipping incompatible /lib/libOpenCL.so when searching for -lOpenCL
/usr/lib64/gcc/x86_64-suse-linux/11/…/…/…/…/x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib/libOpenCL.so when searching for -lOpenCL
/usr/lib64/gcc/x86_64-suse-linux/11/…/…/…/…/x86_64-suse-linux/bin/ld: cannot find -lOpenCL
/usr/lib64/gcc/x86_64-suse-linux/11/…/…/…/…/x86_64-suse-linux/bin/ld: skipping incompatible /lib/libOpenCL.so when searching for -lOpenCL
/usr/lib64/gcc/x86_64-suse-linux/11/…/…/…/…/x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib/libOpenCL.so when searching for -lOpenCL
collect2: Fehler: ld gab 1 als Ende-Status zurück
make: *** [Makefile:38: wholeRunGPU] Fehler 1

*Ich habe eine Nvidia GPU und eine von Intel - ich kann gerade nicht herausfinden, welche Nvidia. Die OpenCL Treiber habe ich über die compute rpm vom Nvidia Repository installiert.

Irgndwie will der Compiler mit der 32 bit Version von OpenCL verlinken, obwohl auch eine 64 bit Version instlliert ist. Kann ich das irgenwie verändern? Wo ist hinterlegt, welche -l Eingaben wie verlinken? Mit -L/usr/lib64/libOpenCL.so hat es nicht funktioniert.

Viele Grüße,
Tobias

Ein guter Programmierer programmiert zeiteffizient und kosteneffizient. Für eine hohe Kosteneffizienz versucht der Programmierer möglichst plattformunabhängig zu programmieren. Ein selber programmiertes Programm sollte auch unter anderen Betriebssystemen und unterschiedlichen Prozessorplattformen (mit keinen oder möglichst wenigen Anpassungen) lauffähig sein.

Aus den oben genannten Gründen empfiehlt sich heute für C/C+±Programme der Einsatz vom Buildsystem CMake anstelle von “GNU Build System”/GNU Autotools.
https://de.wikipedia.org/wiki/CMake

https://de.wikipedia.org/wiki/GNU_Build_System

https://www.linux-magazin.de/ausgaben/2007/02/mal-ausspannen/

https://opensource.com/article/21/5/cmake

Eventuell ist der Einsatz von CMake in Kombination mit Ninja sinnvoll:
https://draketuroth.wordpress.com/2019/07/03/setting-up-ninja-for-cmake-on-windows/

https://fd.io/docs/vpp/v2101/gettingstarted/developers/buildsystem/cmakeandninja.html

Anleitungen zu CMake findet man unter:

https://cmake.org/cmake/help/book/mastering-cmake/index.html

Darin ist auch eine ausführliche “Cross Compiling”-Anleitung enthalten. Diese Anleitung sollte die oben gestellte Frage beantworten.
https://cmake.org/cmake/help/book/mastering-cmake/chapter/Cross%20Compiling%20With%20CMake.html

Weiter sollte ein guter Programmierer für die Programmierarbeiten eine “Integrierte Entwicklungsumgebung” (IDE) verwenden. Eine IDE unterstützt Autovervollständigen und weitere nützliche Funktionen für die Programmierarbeit, was Zeit und Geld einspart. In der IDE kann häufig auch bequem die “Target Platform” gewählt werden, was die oben beschriebene Fragestellung elegant löst.
https://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung

Eine Auflistung der häufigsten verwendeten IDE’s findet man unter:
https://de.wikipedia.org/wiki/Liste_von_integrierten_Entwicklungsumgebungen

Aus dieser Liste wählt man die IDE nach dem eigenen Geldbeutel, Geschmack und Ansprüchen aus. Sinnvoll ist natürlich der Einsatz einer IDE, welche über eine gute CMake-Unterstützung verfügt.

Ich persönlich habe mich unter Linux für die Programmierung von C/C+±Programme für den Einsatz der IDE “Qt Creator” entschieden:
https://de.wikipedia.org/wiki/Qt_Creator

Qt Creator ist auf dieser Webseite erhältlich. Registrierung mit “Qt Account” ist für die Verwendung von Qt Creator zwingend erforderlich!
https://www.qt.io/offline-installers

https://login.qt.io/login

Viel Spass weiterhin beim Programmieren!

Und hier noch eine Installationsanleitung für Qt Creator:
https://web.stanford.edu/dept/cs_edu/resources/qt/install-linux

Für möglichst portablen C/C+±Code sollte der Compiler so konfiguriert werden, dass er nur Programmcode nach ISO-Norm zulässt.
https://gcc.gnu.org/onlinedocs/gcc/Standards.html

Zudem sollte die Optimierung korrekt konfiguriert werden. Siehe dazu:
https://documentation.suse.com/sbp/all/html/SBP-GCC-10/index.html

https://documentation.suse.com/sbp/server-linux/

Für ein in der Programmiersprache C++ geschriebenes HelloWorld-Programm mit CMake sieht das wie folgt aus:

main.cc:

#include <iostream> 
 
using namespace std; 
 
int main() 
{ 
    cout << "Hello World!" << endl; 
    return 0; 
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5 FATAL_ERROR) 
 
project(HelloWorld LANGUAGES CXX) 
 
set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 
 
set(CMAKE_CXX_FLAGS "-O2") 
 
add_executable(HelloWorld main.cc)

Build-Prozess mit CMake:

# cmake .
# make clean
# make VERBOSE=1
# ./HelloWorld
=> Hello World!

Hallo,

Ich habe eine gute Anleitung auf der Seite der Khronos Group bekommen:

https://community.khronos.org/t/linking-error-for-old-nvidia-card-on-opensuse-tumbleweed/108773

Der Grund, weshalb es zum Kompilierfehler kommt, ist dass es kein /usr/lib64/libOpenCL.so gibt (genauso für 32 bit).

Die Erstellung eines Links hat das Problem gelöst:
ln -s /usr/lib64/libOpenCL.so.1 /usr/lib64/libOpenCL.so

Viele Grüße,
Tobias

Unter SLED15SP3 (Suse Linux Enterprise Desktop) wird libOpenCL.so.1 vom ICD im RPM “libOpenCL1” bereit gestellt:

rpm -ql libOpenCL1 |grep -i so.1

/etc/alternatives/libOpenCL.so.1
/usr/lib64/libOpenCL.so.1
/usr/lib64/ocl-icd/libOpenCL.so.1
/usr/lib64/ocl-icd/libOpenCL.so.1.0.0

Ähnlich oder gleich wird es auch unter OpenSUSE Leap 15.3 sein.

Unter SLED15SP3 (Suse Linux Enterprise Desktop) wird für die Anwendung von OpenCL auf der Intel-Grafikkarte (GPU) zusätzlich noch das RPM “beignet” benötigt.

Für die Installation und Konfiguration von OpenCL unter Linux siehe:
https://bashbaug.github.io/opencl/2019/07/06/OpenCL-On-Linux.html

Für OpenCL unter Windows siehe:
https://www.geeks3d.com/20181220/how-to-enable-intel-opencl-support-on-windows-when-amd-radeon-graphics-driver-is-installed/

Einen Einstieg in die Programmierung mit OpenCL bietet:
https://www.nersc.gov/assets/pubs_presos/MattsonTutorialSC14.pdf

https://handsonopencl.github.io/