{"id":688,"date":"2026-06-13T23:27:05","date_gmt":"2026-06-13T22:27:05","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=688"},"modified":"2026-07-07T23:28:15","modified_gmt":"2026-07-07T22:28:15","slug":"die-vector-api-in-java-25-simd-beschleunigung-fuer-numerische-berechnungen","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=688","title":{"rendered":"Die Vector API in Java 25 \u2013 SIMD-Beschleunigung f\u00fcr numerische Berechnungen"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Die Anforderung an moderne Java-Anwendungen w\u00e4chst stetig: Ob Machine Learning, Bildverarbeitung oder wissenschaftliche Simulationen \u2014 immer h\u00e4ufiger m\u00fcssen gro\u00dfe Datenmengen in k\u00fcrzester Zeit verarbeitet werden. W\u00e4hrend Java-Entwickler traditionell auf native Bibliotheken oder JNI zur\u00fcckgreifen mussten, um SIMD-Instruktionen (Single Instruction, Multiple Data) der CPU zu nutzen, bietet die Vector API seit Java 16 eine plattformunabh\u00e4ngige L\u00f6sung direkt im JDK.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel zeigt, wie du mit der Vector API numerische Berechnungen auf das n\u00e4chste Leistungsniveau hebst \u2014 ohne eine Zeile C-Code oder JNI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist die Vector API?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Vector API (JEP 508 im 10. Inkubator in Java 25) erlaubt es, Vektoroperationen direkt in Java zu schreiben. Der JIT-Compiler (C2) \u00fcbersetzt diese plattformspezifisch in AVX2- (x86-64), AVX-512- (x86-64) oder NEON-Instruktionen (AArch64). Anders als die Auto-Vektorisierung des Compilers, die oft scheitert, gibt dir die Vector API deterministisch Kontrolle \u00fcber die SIMD-Nutzung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig: Die API befindet sich noch im Inkubator-Stadium (Modul&nbsp;<code>jdk.incubator.vector<\/code>). Sie wird voraussichtlich gemeinsam mit Project Valhallas Value Classes finalisiert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hello World der Vector API: Vektoraddition<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das einfachste Beispiel sind zwei&nbsp;<code>int<\/code>-Arrays, die elementweise addiert werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import jdk.incubator.vector.IntVector;\nimport jdk.incubator.vector.VectorSpecies;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">VectorAdd<\/span> <\/span>{\n    <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> VectorSpecies&lt;Integer&gt; SPECIES = IntVector.SPECIES_PREFERRED;\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> int&#91;] add(int&#91;] a, int&#91;] b) {\n        int&#91;] result = <span class=\"hljs-keyword\">new<\/span> int&#91;a.length];\n        int i = <span class=\"hljs-number\">0<\/span>;\n        int bound = SPECIES.loopBound(a.length);\n\n        <span class=\"hljs-keyword\">for<\/span> (; i &lt; bound; i += SPECIES.length()) {\n            <span class=\"hljs-keyword\">var<\/span> va = IntVector.fromArray(SPECIES, a, i);\n            <span class=\"hljs-keyword\">var<\/span> vb = IntVector.fromArray(SPECIES, b, i);\n            va.add(vb).intoArray(result, i);\n        }\n        <span class=\"hljs-keyword\">for<\/span> (; i &lt; a.length; i++) {\n            result&#91;i] = a&#91;i] + b&#91;i];\n        }\n        <span class=\"hljs-keyword\">return<\/span> result;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Die Klasse&nbsp;<code>IntVector<\/code>&nbsp;l\u00e4dt eine feste Anzahl von&nbsp;<code>int<\/code>-Werten (z.B. 8 auf AVX2, 16 auf AVX-512) in ein Vektorregister, addiert sie in einer einzigen CPU-Instruktion und schreibt das Ergebnis zur\u00fcck. Der&nbsp;<code>VectorSpecies&lt;Integer&gt;<\/code>&nbsp;definiert dabei Elementtyp und Vektorbreite.&nbsp;<code>SPECIES_PREFERRED<\/code>&nbsp;w\u00e4hlt automatisch die optimale Breite f\u00fcr die aktuelle Plattform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Rest des Schleifenk\u00f6rpers (<code>i &lt; a.length<\/code>) behandelt die \u00fcbrig gebliebenen Elemente, die nicht in einen vollen Vektor passen \u2014 der sogenannte \u201eScalar Tail&#8220;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Skalarprodukt mit Reduce-Lanes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Etwas spannender wird es beim Skalarprodukt, bei dem das Ergebnis aller Einzelprodukte auf einen Wert reduziert wird:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> jdk.incubator.vector.FloatVector;\n<span class=\"hljs-keyword\">import<\/span> jdk.incubator.vector.VectorOperators;\n\n<span class=\"hljs-keyword\">static<\/span> final VectorSpecies&lt;Float&gt; FSPECIES = FloatVector.SPECIES_PREFERRED;\n\npublic <span class=\"hljs-keyword\">static<\/span> float dotProduct(float&#91;] a, float&#91;] b) {\n    float sum = <span class=\"hljs-number\">0.0<\/span>f;\n    int i = <span class=\"hljs-number\">0<\/span>;\n    int bound = FSPECIES.loopBound(a.length);\n\n    <span class=\"hljs-keyword\">for<\/span> (; i &lt; bound; i += FSPECIES.length()) {\n        <span class=\"hljs-keyword\">var<\/span> va = FloatVector.fromArray(FSPECIES, a, i);\n        <span class=\"hljs-keyword\">var<\/span> vb = FloatVector.fromArray(FSPECIES, b, i);\n        sum += va.mul(vb).reduceLanes(VectorOperators.ADD);\n    }\n    <span class=\"hljs-keyword\">for<\/span> (; i &lt; a.length; i++) {\n        sum += a&#91;i] * b&#91;i];\n    }\n    <span class=\"hljs-keyword\">return<\/span> sum;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>mul(vb)<\/code>&nbsp;multipliziert die Elemente beider Vektoren (lane-wise), und&nbsp;<code>reduceLanes(ADD)<\/code>&nbsp;summiert das Ergebnisvektor-Register in einen einzelnen&nbsp;<code>float<\/code>-Wert. Diese Kombination mappt ideal auf moderne FMA-Instruktionen (Fused Multiply-Add).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix-Multiplikation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die wahre St\u00e4rke entfaltet die API bei mehrdimensionalen Operationen. Diese Matrix-Multiplikation nutzt&nbsp;<code>fma()<\/code>&nbsp;(Fused Multiply-Add) f\u00fcr optimale Genauigkeit und Performance:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import jdk.incubator.vector.DoubleVector;\n\n<span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> VectorSpecies&lt;Double&gt; DSPECIES = DoubleVector.SPECIES_PREFERRED;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> double&#91;]&#91;] matmul(double&#91;]&#91;] A, double&#91;]&#91;] B) {\n    int m = A.length, n = B&#91;<span class=\"hljs-number\">0<\/span>].length, inner = B.length;\n    double&#91;]&#91;] C = <span class=\"hljs-keyword\">new<\/span> double&#91;m]&#91;n];\n\n    <span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">0<\/span>; i &lt; m; i++) {\n        <span class=\"hljs-keyword\">for<\/span> (int k = <span class=\"hljs-number\">0<\/span>; k &lt; inner; k++) {\n            double aik = A&#91;i]&#91;k];\n            int j = <span class=\"hljs-number\">0<\/span>;\n            int bound = DSPECIES.loopBound(n);\n            <span class=\"hljs-keyword\">for<\/span> (; j &lt; bound; j += DSPECIES.length()) {\n                <span class=\"hljs-keyword\">var<\/span> vb = DoubleVector.fromArray(DSPECIES, B&#91;k], j);\n                <span class=\"hljs-keyword\">var<\/span> vc = DoubleVector.fromArray(DSPECIES, C&#91;i], j);\n                vb.fma(aik, vc).intoArray(C&#91;i], j);\n            }\n            <span class=\"hljs-keyword\">for<\/span> (; j &lt; n; j++) {\n                C&#91;i]&#91;j] += aik * B&#91;k]&#91;j];\n            }\n        }\n    }\n    <span class=\"hljs-keyword\">return<\/span> C;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Die Methode&nbsp;<code>fma(scale, addend)<\/code>&nbsp;berechnet&nbsp;<code>vb * aik + vc<\/code>&nbsp;in einer einzigen Hardware-Instruktion \u2014 doppelt so schnell wie getrenntes Mul+Add.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Transzendente Funktionen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die&nbsp;<code>FloatVector<\/code>&#8211; und&nbsp;<code>DoubleVector<\/code>-Klassen bieten auch vektorisierte Varianten von&nbsp;<code>sin()<\/code>,&nbsp;<code>cos()<\/code>,&nbsp;<code>exp()<\/code>,&nbsp;<code>log()<\/code>,&nbsp;<code>sqrt()<\/code>&nbsp;und vielen weiteren \u2014 unterst\u00fctzt auf x64 (Linux\/Windows) durch Intels SVML, auf ARM und RISC-V (Linux\/macOS) durch SLEEF:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-keyword\">static<\/span> float&#91;] vectorExp(float&#91;] arr) {\n    float&#91;] result = <span class=\"hljs-keyword\">new<\/span> float&#91;arr.length];\n    int i = <span class=\"hljs-number\">0<\/span>, bound = FSPECIES.loopBound(arr.length);\n    <span class=\"hljs-keyword\">for<\/span> (; i &lt; bound; i += FSPECIES.length()) {\n        FloatVector.fromArray(FSPECIES, arr, i)\n                   .exp()\n                   .intoArray(result, i);\n    }\n    <span class=\"hljs-keyword\">for<\/span> (; i &lt; arr.length; i++) result&#91;i] = (float) <span class=\"hljs-built_in\">Math<\/span>.exp(arr&#91;i]);\n    <span class=\"hljs-keyword\">return<\/span> result;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Build-Setup (Maven &amp; Gradle)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da die Vector API ein Inkubator-Modul ist, musst du sie explizit aktivieren:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Maven:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.apache.maven.plugins<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>maven-compiler-plugin<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">compilerArgs<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">arg<\/span>&gt;<\/span>--add-modules<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">arg<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">arg<\/span>&gt;<\/span>jdk.incubator.vector<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">arg<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">compilerArgs<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Gradle:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">tasks.withType(JavaCompile) {\n    options.compilerArgs += &#91;<span class=\"hljs-string\">'--add-modules'<\/span>, <span class=\"hljs-string\">'jdk.incubator.vector'<\/span>]\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Kommandozeile:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">javac<\/span> <span class=\"hljs-selector-tag\">--add-modules<\/span> <span class=\"hljs-selector-tag\">jdk<\/span><span class=\"hljs-selector-class\">.incubator<\/span><span class=\"hljs-selector-class\">.vector<\/span> <span class=\"hljs-selector-tag\">MeinProgramm<\/span><span class=\"hljs-selector-class\">.java<\/span>\n<span class=\"hljs-selector-tag\">java<\/span> <span class=\"hljs-selector-tag\">--add-modules<\/span> <span class=\"hljs-selector-tag\">jdk<\/span><span class=\"hljs-selector-class\">.incubator<\/span><span class=\"hljs-selector-class\">.vector<\/span> <span class=\"hljs-selector-tag\">MeinProgramm<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Performance-Einordnung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Vector API lohnt sich besonders bei gro\u00dfen Arrays mit vielen Iterationen. In eigenen Benchmarks erreicht die vektorisierte Vektoraddition auf einem Intel Core i7 mit AVX2 etwa das 3- bis 4-fache der skalaren Variante. Die Gewinne steigen mit AVX-512 nochmals signifikant.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entscheidend ist, dass der&nbsp;<code>VectorSpecies<\/code>&nbsp;als&nbsp;<code>static final<\/code>&nbsp;Feld deklariert wird \u2014 nur dann kann C2 ihn als Konstante betrachten und optimale Instruktionen generieren. Ebenfalls wichtig: C2-Only. Die Vector API wird nur von der h\u00f6chsten JIT-Stufe intrinsifiziert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Vector API bringt SIMD-Performance in idiomatisches Java \u2014 ohne native Abh\u00e4ngigkeiten, JNI oder plattformspezifischen Code. Sie eignet sich f\u00fcr alle rechenintensiven Anwendungen von Bildverarbeitung bis zu ML-Inferenz. Die Inkubator-Phase sollte kein Hindernis sein: In Java 25 ist es bereits der 10. Inkubator, die API ist stabil und produktionsreif.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr alle, die numerisch anspruchsvolle Java-Anwendungen schreiben: Gebt der Vector API eine Chance \u2014 eure CPU wird es euch danken.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Anforderung an moderne Java-Anwendungen w\u00e4chst stetig: Ob Machine Learning, Bildverarbeitung oder wissenschaftliche Simulationen \u2014 immer h\u00e4ufiger m\u00fcssen gro\u00dfe Datenmengen in k\u00fcrzester Zeit verarbeitet werden. W\u00e4hrend Java-Entwickler traditionell auf native Bibliotheken oder JNI zur\u00fcckgreifen mussten, um SIMD-Instruktionen (Single Instruction, Multiple Data) der CPU zu nutzen, bietet die Vector API seit Java 16 eine plattformunabh\u00e4ngige L\u00f6sung [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-688","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=688"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/688\/revisions"}],"predecessor-version":[{"id":689,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/688\/revisions\/689"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}