Ich weiß, Java ist eine sichere Sprache, aber wenn Matrixberechnungen benötigt werden, kann ich etwas schneller versuchen?Code Injizieren/Assembly Inlining in Java?
Ich lerne __asm {} in C++, Digital-Mars-Compiler und FASM. Ich möchte dasselbe in Java machen. Wie kann ich Inline-Assembler-Codes in Funktionen einbauen? Ist das überhaupt möglich?
Etwas Ähnliches (a vektorisierten Schleife alle Elemente eines Arrays auf einen Wert klemmen, ohne Verzweigung, unter Verwendung von AVX Unterstützung der 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
vmovups %ymm1, (%rdi, %rdx, 4)
# TODO: unroll the loop a bit, and maybe use aligned loads/stores in the main loop
add $32, %rdx
cmp %rcx, %rdx
jb .Lloop # } while(idx < count)
);
System.out.println(var[0]);
Ich möchte nicht einen Code-Injektor verwenden. Ich möchte die Intel® oder AT & T Stil x86 Anweisungen sehen.
Wenn Sie schreiben asm wie die (16-Bit-Register und mit 'div' von 4 anstelle eines' shr al, 2'), [es ist definitiv * nicht * gehen schneller zu sein als das, was ein C-Compiler könnte machen für dich.] (https://stackoverflow.com/questions/40354978/why-is-this-c-code-faster-than-my-hand-written-assembly-for-testing-the-collat/40355466# 40355466), also sollten Sie einfach JNI mit C oder C++ verwenden. ASM ist nur dann nützlich für die Performance, wenn Sie wissen, wie Sie die Mikroarchitektur aktueller CPUs einstellen können. Dies ist eine nützliche Frage, aber das Beispiel ist ein Beispiel dafür, warum die meisten Leute * asm nicht verwenden sollten. –
Sie haben Recht. Zwei Dinge gleichzeitig. Ich würde etwas wie ein AVX-Punktprodukt mit der richtigen Reihenfolge der Anweisungen hinzufügen, wenn ich zu diesem Zeitpunkt genug Erfahrung hatte. –
Sie könnten die Frage bearbeiten, um etwas Modernes zu verwenden. Wie vielleicht BMI2 'pdep', die kein Java intrinsisch hat. Im Idealfall könnten Sie sich etwas einfallen lassen, das Sie nicht so leicht einen C-Compiler für sich aussenden könnten. –