Code-Injektion/Montage inlining in Java?

Ich weiß, Java ist eine sichere Sprache, aber bei matrix-Berechnungen erforderlich sind, kann ich versuchen, etwas schneller?

Ich Lerne __asm{} in C++, Digital Mars-compiler und FASM. Ich möchte das gleiche zu tun in Java. Wie kann ich den inline Assembler codes in Funktionen? Ist das überhaupt möglich?

So etwas (ein Vektorgrafik-Schleife Klammer, die alle Elemente eines Arrays zu einem Wert ohne Verzweigung, mit AVX-Unterstützung von CPU):

JavaAsmBlock(
   # get pointers into registers somehow
   # and tell Java which registers the asm clobbers somehow
     vbroadcastss  twenty_five(%rip), %ymm0
     xor   %edx,%edx
.Lloop:                            # do {
    vmovups   (%rsi, %rdx, 4), %ymm1
    vcmpltps   %ymm1, %ymm0, %ymm2
    vblendvps  %ymm2, %ymm0, %ymm1, %ymm1  # TODO: use vminps instead
    vmovups    %ymm1, (%rdi, %rdx, 4)
    # TODO: unroll the loop a bit, and maybe handle unaligned output specially if that's common
    add         $32, %rdx
    cmp         %rcx, %rdx
    jb     .Lloop                  # } while(idx < count)
    vzeroupper
);

System.out.println(var[0]);

Ich nicht wollen, verwenden Sie einen code-injector. Ich möchte, um zu sehen, die auf Intel-oder AT&T Stil x86-Anweisungen.

  • Wenn Sie asm schreiben, wie das (16-bit-Register und mit div von 4 statt einer shr al, 2), it definitiv nicht dabei, schneller zu sein als das, was ein C-compiler machen könnte für Sie., so sollten Sie nur verwenden JNI mit C oder C++. ASM ist nur sinnvoll, wenn Leistung, wenn Sie wissen, wie die Melodie für die Mikroarchitektur des aktuellen CPUs. Dies ist eine sinnvolle Frage, aber das Beispiel ist ein Beispiel, warum die meisten Menschen nicht verwenden, asm.
  • Du hast Recht. Zwei Dinge zur gleichen Zeit. Ich würde hinzufügen, so etwas wie eine AVX-dot-Produkt mit der richtigen Reihenfolge von Anweisungen, die, wenn ich hatte genug Erfahrungen in dieser Zeit.
  • Sie Bearbeiten die Frage etwas zu benutzen moderne. Wie vielleicht BMI2 pdep, die keine Java-immanent. Im Idealfall könnte man sich was einfallen lassen, Sie konnte nicht einfach wie leicht erhalten Sie einen C-compiler zu Strahlen für Sie, obwohl.
  • Ich hatte Intels opencl-c-compiler erstellen Sie eine astfreie "vektorisiert Klemme 25.0 f" Verfahren und stellen nur ein Teil der hier(codeshare.io/29pqeB). Würden Sie mir, es zu betrachten? Sollte ich hinzufügen, vollständigen code, oder ist es umleiten Grundgedanke der Frage nach irgendwo anders?
  • Ich fixierte Ihre asm beinhalten die aktuelle Schleife, anstatt nur den Schleifen-overhead, aber keine Niederlassung. Und optimiert und es etwas, was Sie wirklich wollen, zu verwenden für hohe Leistung. Sie verwendet eine signierte 32-bit-Schleifenzähler in einer Weise, dass der compiler gezwungen zu Unterschreiben-erweitern Sie es innerhalb der Schleife bei jeder iteration.
  • Ich danke Ihnen sehr. Eigentlich habe ich das nicht gesagt-compiler darüber, wie viele(die sollte Vielfaches von 8 und große) Elemente verarbeitet werden sollen. Es hat gewählt, es irgendwie mit Annahme der Prozessor ist ein Intel und Elemente sind weniger als 4G? Ich bin mit fx8150.
  • Nun, die einzige Quelle, die Sie enthalten, wurde eine Funktion für die 8 Schwimmer aus dem Speicher. Es ist bis zu Sie, um es in einer Schleife. Und was macht Sie denken, dass Sie beschlossen, zu optimieren speziell für die Intel? Splitting-256b-stores ist gut für Pfahlramme, auch wenn Sie ausgerichtet ist, weil der CPU-performance-bug oder etwas mit AVX-Shops. Wenn tuning speziell für Pfahlramme, vielleicht nur mithilfe von XMM-Anleitung wäre noch besser gewesen, aber das compiler-Ausgabe wäre ok. Eh, das asm in der Frage ist jetzt eine gute Allgemeine Beispiel nicht ablenken Leser mit jeder uarch tuning.
  • Es war eine Warnung in der Dokumentation, dass es ist optimiert für Intel nur, aber der erzeugte code ist so schnell, wie ich brauche, zumindest. Dies ist ein "code-generator"-add-on für visual studio von Intel.
  • Die codeshare-link hat eine .ident "clang version 3.6.2 " Linie. Also vermutlich bist du mit einem alten clang version.
  • Ich wusste nicht, Intel war mit clang für opencl-compiler 🙂 Vielleicht ist es besser als gcc-6.x, die widerstanden zu kompilieren, wie ich muss(unter linux zumindest, aber jetzt bin ich auf windows).
  • Oder ist das Geräusch bereits in windows(irgendwie vorinstalliert mit windows) und verwendet es, genau wie ubuntu hatte gcc standardmäßig?

Schreibe einen Kommentar