私はJavaが安全な言語だと知っていますが、行列の計算が必要な場合は、もっと速く試すことができますか?Javaでのコードの挿入/アセンブリのインライン化?
私はC++、Digital-Marsコンパイラ、FASMで__asm {}を学んでいます。私は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
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 & Tスタイルのx86命令を見たいと思っています。
あなたがそのようなASM書いている場合は(代わりに 'SHRのAl 4によって16ビットレジスタをと' div'を使用して、2 ')、[間違いなく* * Cコンパイラができたものよりも速くなることはないだろうあなたのために作る。](https://stackoverflow.com/questions/40354978/why-is-this-c-code-faster-than-my-hand-written-assembly-for-testing-the-collat/40355466# 40355466)、CまたはC++でJNIを使用するだけです。 ASMは、現在のCPUのマイクロアーキテクチャをチューニングする方法を知っている場合にのみ、パフォーマンスに役立ちます。これは便利な質問ですが、例は大部分の人が* asmを使用すべきでない理由の例です。 –
あなたは正しいです。同時に2つのこと。私は、その時点で十分な経験があれば、AVXのドットプロダクトのようなものを適切な命令の順序で追加します。 –
質問を編集して、何か近代的なものを使うことができます。 BMI2の 'pdep'のように、Javaの組み込み関数がありません。理想的には、あなたがCコンパイラを簡単に手に入れることができないようなものを考え出すことができます。 –