我知道Java是一種安全的語言,但是當需要矩陣計算時,我可以更快地嘗試一些東西嗎?Java中的代碼注入/裝配內聯?
我正在學習C++,數字火星編譯器和FASM中的__asm {}。我想在Java中做同樣的事情。如何在函數中內聯彙編代碼?這甚至有可能嗎?
是這樣的(一個量化循環到一個數組中的所有元素鉗位到值沒有分支,使用AVX支持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]);
我不想使用代碼噴射器。我想查看英特爾或AT風格x86指令AT &。
如果你正在寫這樣的ASM(16位寄存器和使用'div' 4,而不是一個'SHR人,2'),[它絕對*不*會比什麼C編譯器可能更快make for you。](https://stackoverflow.com/questions/40354978/why-is-this-c-code-faster-than-my-hand-written-assembly-for-testing-the-collat/40355466# 40355466),所以你應該使用JNI與C或C++。如果您知道如何調整當前CPU的微體系結構,則ASM只對性能有用。這是一個有用的問題,但這個例子是爲什麼大多數人*不應該使用asm的例子。 – 2017-10-07 18:24:53
你說得對。兩件事情在同一時間。如果我當時有足夠的經驗,我會按照適當的指令順序添加類似AVX點的產品。 – 2017-10-07 18:53:13
您可以編輯問題以使用現代的東西。就像也許BMI2'pdep',它沒有Java內在。不過,理想情況下,您可以想出一些您不能輕鬆獲得C編譯器爲您發佈的東西。 – 2017-10-07 18:57:57