我知道Java是一种安全的语言,但在需要进行矩阵计算时,我可以尝试一些更快的东西吗?
我正在学习C++中的__asm{}、Digital-Mars编译器和FASM。我想在Java中做同样的事情。如何在函数中嵌入汇编代码?这是否可能?
类似于以下内容(使用CPU的AVX支持,对数组的所有元素进行值限制的向量化循环,而不使用分支):
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]);
我不想使用代码注入器,我想查看Intel或AT&T风格的x86指令。
div
除以4而不是shr al,2
),那么它绝对不会比C编译器生成的代码更快。,所以你应该使用带有C或C ++的JNI。只有在你知道如何针对当前CPU微体系结构进行调整时,汇编语言才有用于性能优化。这是一个有用的问题,但是示例是为什么大多数人不应该使用汇编语言的例子。 - Peter Cordespdep
,它没有Java内在函数。理想情况下,你可以想出一些C编译器无法轻易生成的内容。 - Peter Cordes