簡體   English   中英

使用本機接口的多個java線程與用於多線程本機的單個java線程

[英]Multiple java threads using native interface vs single java thread for multi threaded native

我正在准備一個使用JNI加速物理建模計算的項目。 Native部分對一組數組進行計算,每個數組都有超過10M的元素。

問題:哪種選擇更適合表現:

1)在java中使用8個線程,每個線程通過本機調用(jni - > c ++)處理1/8部分數組。 我是否需要將整個數組裁剪成較小的數組以防止不必要的數組復制?

2)在java中使用單線程調用8線程的本機(pthreads?)我可以使用指針算術來僅選擇在線程中使用的必要部分嗎?

我需要處理單個副本(或原始)數組,c ++線程是否為自己復制整個數組? 那么java線程呢? 哪一個不復制,我會用那個。

注意:我使用GetPrimitiveArrayCritical()來防止JNI接口的數組復制(原始工作)。 計算需要足夠長的時間才能忽略JNI開銷。

GetPrimitiveArrayCritical() java數組,因此GC停止工作,直到本機函數釋放它,這會影響其他Java線程可訪問性嗎?

實際上,如果重要的話,所有人都在extern "C"

OS:64位windows7 CPU:fx8150 jvm:64位GCC:64位

謝謝。

從設計的角度來看,我更喜歡方法#1,因為這意味着您不必管理JNI代碼中的線程。 這符合“單一責任原則”:如果算法發生變化,您的本機代碼只需要更改。 我還認為Java提供的工具(線程池和期貨)比直接線程更容易使用。

但是,如果這樣做,您應該特別注意有關從多個線程固定和取消固定數組的警告

更好的方法IMO是分配直接的 ByteBuffer ,並使用GetDirectBufferAddress從JNI訪問它。 這將允許您使用Java端線程池來管理工作,並將消除任何關於緩沖區副本的本機方面的擔憂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM