Zum Inhalt springen
hanse-computing.de
  • Moin
  • Über uns
  • Leistungen
  • Projekte
  • Neuigkeiten
  • Wissen
    • Netzwerktechniken
    • Systemadministration
    • Hardware-Spezifikationen
    • KI & Automatisierung
    • Glossar
      • Fachbegriffe
      • Programmiersprachen-Befehle
    • Datenbanken
    • IT-Grundlagen
    • Python: Grundlagen
    • Python: Datenstrukturen
    • Python: Dateien & IO
    • Python: Web & Frameworks
    • Python: Fehler & Debugging
    • Webentwicklung
    • Linux & Betriebssysteme
    • IT-Sicherheit
    • Cloud & Container
    • Tools & Software
    • Netzwerk: TCP/IP
    • Netzwerk: DNS & Dienste
    • Netzwerk: Sicherheit
    • Netzwerk: Tools
    • KI: Grundlagen
    • KI: Praxis
    • KI: LLM & Agenten
    • Hardware: Server
    • Hardware: Netzwerkgeräte
    • Hardware: Peripherie
    • Wiki-Startseite
    • Letzte Änderungen
    • Kategorie-Browser
    • Zufallsartikel
  • Infrastruktur
  • AI Easy Start
  • Test-Drive
  • Kontakt
  • Impressum
  • Datenschutz

Sprache auswählen

  • Deutsch (Deutschland)
  • English (United Kingdom)
  1. Aktuelle Seite:  
  2. Startseite
  3. Wissen
  4. Glossar
  5. Programmiersprachen-Befehle

OpenCL-Befehle: Host-API und Kernel-Sprache im Überblick

OpenCL (Open Computing Language) besteht aus zwei Teilen: einer Host-API in C, mit der das Programm Geräte auswählt und Kernel startet, und der Kernel-Sprache OpenCL C, in der die auf der GPU laufenden Funktionen geschrieben werden. Dieser Artikel listet die wichtigsten Funktionen beider Seiten.

Plattform und Gerät wählen

clGetPlatformIDs(1, &platform, &n)   // OpenCL-Plattform finden
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL)

Kontext, Queue und Kernel bauen

clCreateContext(NULL, 1, &device, NULL, NULL, &err)
clCreateCommandQueueWithProperties(ctx, device, NULL, &err)  // seit OpenCL 2.0; ersetzt clCreateCommandQueue
clCreateProgramWithSource(ctx, 1, &src, NULL, &err)
clBuildProgram(prog, 1, &device, NULL, NULL, NULL)
clCreateKernel(prog, "vec_add", &err)

Die ältere Funktion clCreateCommandQueue gilt seit OpenCL 2.0 als veraltet; neuere Programme nutzen die WithProperties-Variante.

Speicher und Kernel-Start

clCreateBuffer(ctx, CL_MEM_READ_WRITE, n * sizeof(float), NULL, &err)
clEnqueueWriteBuffer(queue, buf, CL_TRUE, 0, bytes, host_ptr, 0, NULL, NULL)
clSetKernelArg(kernel, 0, sizeof(cl_mem), &buf)
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, NULL)
clEnqueueReadBuffer(queue, buf, CL_TRUE, 0, bytes, host_ptr, 0, NULL, NULL)

Kernel in OpenCL C

__kernel void vec_add(__global const float *a,
                      __global const float *b,
                      __global float *c) {
    int i = get_global_id(0);
    c[i] = a[i] + b[i];
}

Jeder Work-Item bekommt eine eindeutige ID: get_global_id(0) liefert sie, get_local_id(0) die Position innerhalb der Work-Group. Speicher-Adressräume heißen __global, __local, __constant und __private; innerhalb einer Work-Group synchronisiert barrier(CLK_LOCAL_MEM_FENCE).

Verwandte Grundlagen: OpenMP-Befehle, MPI-Befehle, CUDA, DSP, FPGA.

OpenMP-Befehle: Die wichtigsten Compiler-Direktiven

OpenMP (siehe OpenMP im Glossar) parallelisiert Programme über Compiler-Direktiven: Statt selbst Threads zu erzeugen, markiert man Codeblöcke, die das System automatisch auf mehreren Kernen ausführt. Unterstützt werden C, C++ und Fortran; in C/C++ beginnen alle Direktiven mit #pragma omp.

Parallelregion und Schleifen

#pragma omp parallel              // Team aus Threads starten
#pragma omp parallel for          // Schleife aufteilen
#pragma omp for schedule(static)  // Iterationen verteilen

Die schedule-Klausel steuert die Verteilung: static (Blöcke vorab), dynamic (zur Laufzeit), guided (abnehmende Blöcke) und runtime (per Umgebungsvariable OMP_SCHEDULE).

Synchronisation

#pragma omp barrier      // alle Threads warten
#pragma omp critical     // geschützter Bereich, einer nach dem anderen
#pragma omp atomic       // atomare Operation auf eine Variable
#pragma omp master       // nur Thread 0 führt aus
#pragma omp single       // genau ein Thread führt aus

Daten teilen und reduzieren

#pragma omp parallel for reduction(+:sum) private(x)
for (i = 0; i < n; i++) { x = a[i] * b[i]; sum += x; }

private(x) gibt jedem Thread eine eigene Kopie, reduction(+:sum) sammelt die Teilsummen am Ende gefahrlos auf. Weitere Klauseln: shared, firstprivate, lastprivate, num_threads, nowait.

Laufzeit-Funktionen

omp_get_thread_num()   // eigene Thread-Nummer
omp_get_num_threads()  // Teamgröße
omp_set_num_threads(8) // Teamgröße setzen
omp_get_wtime()        // Stoppuhr in Sekunden

Die Umgebungsvariable OMP_NUM_THREADS setzt die Standard-Teamgröße, ohne den Code zu ändern.

Verwandte Grundlagen: OpenCL-Befehle, MPI-Befehle, Thread, Multikern-Prozessor, Nebenläufigkeit.

MPI-Befehle: Die wichtigsten Funktionen der Message Passing Interface

MPI (Message Passing Interface, siehe MPI im Glossar) ist der Standard für verteilte Systeme und Supercomputer: Viele Prozesse mit getrenntem Speicher tauschen Nachrichten. Die wichtigsten Implementierungen sind Open MPI, MPICH und Intel MPI; gestartet wird ein Programm mit mpirun -np 4 ./programm.

Initialisierung und Umgebung

MPI_Init(&argc, &argv);        // MPI starten
MPI_Comm_rank(MPI_COMM_WORLD, &rank);  // eigene Prozess-Nummer
MPI_Comm_size(MPI_COMM_WORLD, &size);  // Anzahl Prozesse
MPI_Get_processor_name(name, &len);
MPI_Finalize();                // MPI beenden

MPI_COMM_WORLD ist der Standard-Kommunikator; rank (0 bis size-1) identifiziert jeden Prozess.

Punkt-zu-Punkt-Kommunikation

MPI_Send(buf, count, MPI_INT, dest, tag, MPI_COMM_WORLD);
MPI_Recv(buf, count, MPI_INT, src, tag, MPI_COMM_WORLD, &status);
MPI_Isend(buf, count, MPI_INT, dest, tag, MPI_COMM_WORLD, &req);  // nichtblockierend
MPI_Irecv(buf, count, MPI_INT, src, tag, MPI_COMM_WORLD, &req);
MPI_Wait(&req, &status);

Nichtblockierende Varianten (MPI_Isend/MPI_Irecv) überlappen Kommunikation und Rechnen; MPI_Wait wartet auf den Abschluss, MPI_Test prüft nur.

Kollektive Operationen

MPI_Bcast(buf, count, MPI_INT, root, MPI_COMM_WORLD);   // an alle senden
MPI_Reduce(&local, &result, 1, MPI_DOUBLE, MPI_SUM, root, MPI_COMM_WORLD);
MPI_Allreduce(&local, &result, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
MPI_Scatter(sendbuf, n, MPI_INT, recvbuf, n, MPI_INT, root, MPI_COMM_WORLD);
MPI_Gather(recvbuf, n, MPI_INT, sendbuf, n, MPI_INT, root, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);

MPI_Bcast verteilt ein Datum von einem Prozess an alle, MPI_Reduce sammelt Teilergebnisse (etwa mit MPI_SUM oder MPI_MAX) bei einem Prozess, MPI_Allreduce bei allen. MPI_Scatter/MPI_Gather teilen bzw. sammeln Arrays.

Verwandte Grundlagen: OpenCL-Befehle, OpenMP-Befehle, Verteilte Systeme, Supercomputer, GPU.

GPG-Befehle: OpenPGP-Schlüssel verwalten, ver- und entschlüsseln

GPG (GNU Privacy Guard, Befehl gpg) ist die freie Implementierung des OpenPGP-Standards. Damit erzeugt man Schlüsselpaare, ver- und entschlüsselt Dateien und E-Mails und signiert Software — etwa die Paketlisten von Debian- und Ubuntu-Repositorien oder Git-Commits.

Schlüssel erzeugen und verwalten

gpg --quick-gen-key "Max Mustermann <Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.>"
gpg --list-keys
gpg --list-secret-keys
gpg --edit-key Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.

Der schnelle Weg nutzt seit GnuPG 2.1 die modernen Elliptic-Curve-Algorithmen Ed25519 (Signieren) und Curve25519 (Verschlüsseln). Das alte RSA-Primärschlüssel-Menü erreicht man mit gpg --full-gen-key. Seit GnuPG 2.2 läuft die Passphrasen-Abfrage über den gpg-agent, der Schlüssel nach einer Weile wegcacht.

Exportieren und importieren

gpg --armor --export Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
gpg --export-secret-keys --armor Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
gpg --import schluessel.asc
gpg --keyserver keys.openpgp.org --send-keys FUZZY0LANGEFINGERPRINT

--armor erzeugt den ASCII-Text (Block beginnt mit -----BEGIN PGP PUBLIC KEY BLOCK-----), der sich gut per E-Mail verschicken lässt. Öffentliche Schlüssel dürfen überall hin; der private Schlüssel gehört ausschließlich auf den eigenen Rechner, am besten mit Passphrase geschützt.

Verschlüsseln, entschlüsseln, signieren

gpg --encrypt --recipient Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. datei.txt
gpg --decrypt datei.txt.gpg
gpg --sign datei.txt
gpg --verify datei.txt.gpg

GPG kombiniert dabei asymmetrische und symmetrische Verschlüsselung (hybrides Verfahren): Ein zufälliger Sitzungsschlüssel verschlüsselt die Daten, der öffentliche Schlüssel des Empfängers verschlüsselt den Sitzungsschlüssel. Wer den eigenen Schlüssel nicht verlieren will, erzeugt sofort nach der Schlüsselerstellung ein Widerrufszertifikat: gpg --gen-revoke Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. und verwahrt es offline.

Fingerabdruck prüfen

gpg --fingerprint Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.

Der Fingerabdruck ist der belastbare Identitätsnachweis eines Schlüssels — vor der ersten Nutzung vergleicht man ihn über einen zweiten Kanal (Webseite, Telefon), dann signiert man den fremden Schlüssel (gpg --sign-key) und baut so das Web of Trust auf. Während GPG mit dezentralen OpenPGP-Schlüsselbunden arbeitet, verwaltet das Java-Ökosystem Zertifikate zentral in Keystores — dort ist das passende Werkzeug keytool.

Verwandte Grundlagen: OpenSSL-Befehle, GPG (Konzept), OpenPGP, Ende-zu-Ende-Verschlüsselung.

Keytool-Befehle: Java-Keystores und Truststores verwalten

keytool ist das Schlüssel- und Zertifikatsverwaltungs-Werkzeug der Java-Plattform. Es verwaltet Keystores (eigene Schlüssel und Zertifikate) und Truststores (vertrauenswürdige fremde Zertifikate, etwa von Zertifizierungsstellen) — die Grundlage für TLS in Java-Anwendungen wie Apache Tomcat, Spring Boot oder Kafka.

Schlüsselpaar erzeugen

keytool -genkeypair -alias example -keyalg RSA -keysize 2048   -keystore keystore.p12 -storetype PKCS12 -validity 365

Seit Java 9 ist PKCS12 das Standard-Keystore-Format; das alte proprietäre JKS gilt als abgelöst. -genkeypair erzeugt ein Schlüsselpaar samt selbstsigniertem Zertifikat — für echte Zertifikate erstellt man daraus einen CSR und lässt ihn von einer Zertifizierungsstelle signieren.

CSR erstellen und Zertifikat importieren

keytool -certreq -alias example -keystore keystore.p12 -file example.csr
keytool -importcert -alias example -file zertifikat.crt -keystore keystore.p12

-certreq erzeugt den Signierantrag, -importcert übernimmt das von der CA signierte Zertifikat zurück in den Keystore. Die Zertifikatskette der CA muss ebenfalls importiert sein, sonst meldet der Server eine unvollständige Kette.

Keystore anzeigen und Formate umwandeln

keytool -list -keystore keystore.p12 -storepass changeit
keytool -importkeystore -srckeystore alt.jks -srcstoretype JKS   -destkeystore neu.p12 -deststoretype PKCS12

Mit -list sieht man alle Einträge eines Keystores, -importkeystore konvertiert zwischen JKS, PKCS12 und PKCS11. Der Standard-Keystore-Passwort-Name der Java-Welt ist changeit — er gehört bei produktiven Systemen geändert.

Truststore pflegen

keytool -importcert -alias mein-ca -file ca.crt -keystore cacerts -storepass changeit

Der mitgelieferte Truststore cacerts (unter $JAVA_HOME/lib/security) enthält die vertrauenswürdigen CA-Zertifikate. Wer eine eigene Zertifizierungsstelle betreibt, importiert deren Zertifikat hier — oder legt einen separaten Truststore an und reicht ihn per -Djavax.net.ssl.trustStore=... an die Anwendung durch. Einen aus OpenSSL exportierten PKCS12-Bundle importiert keytool direkt, das ist die Brücke zwischen beiden Welten. Das dezentrale Gegenmodell zur zentralen CA-Liste pflegt das OpenPGP-Universum: Dort beglaubigen sich Nutzer gegenseitig per Web of Trust, verwaltet durch GPG.

Verwandte Grundlagen: OpenSSL-Befehle, Tomcat-Befehle, PKI.

  1. OpenSSL-Befehle: Schlüssel, Zertifikate und TLS-Verbindungen prüfen
  2. Apache-Befehle: Den Apache HTTP Server verwalten
  3. Nginx-Befehle: Konfiguration testen und den Dienst steuern
  4. Tomcat-Befehle: Apache Tomcat starten und verwalten

Seite 13 von 46

  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
hanse-computing.de

hanse-computing.de – KI-gestützte Dienstleistungen aus Lübeck.

hanse-computing.de
IT-Dienstleistungen aus der Hansestadt
Über uns · Projekte · Neuigkeiten · Affiliate
Impressum · Datenschutz
© 2026 hanse-computing.de
© 2026 hanse-computing Impressum Datenschutz