###前提・実現したいこと
Javaで並列数値計算を行うプログラムを書いています。
反復的に同じ量を計算するのですが、各反復の結果に応じてパラメータを変化させ、それを使ってまた同じ計算をするというプログラムです。
並列計算は、その一回一回の計算を行う時に毎回行っており、各スレッドで別々の数値データを読み込んで計算を行います。
これをワークステーション(詳細は下記)でCPU稼働率100%弱で効率的に計算したいです。
###発生している問題・エラーメッセージ
100スレッド並列で計算するプログラムになっているのですが、実行後しばらくは
想定通り稼働率100%で動いてくれるのですが、途中からCPUが平均して10%程度しか利用されません。
尚、1回の反復で20分かかる程度の重さの計算です。また並列するスレッドの数を30程度やそれ以下に減らしても同様です。
###該当のソースコード
Java
1 2//重要でない部分を簡略化したコードでお示ししています 3public class Main{ 4 static int threadNum = 100; 5 6 public static void main(String[] args){ 7 ... 8 // iterationしてパラメータxを更新する 9 for(int i=0;i<iterMax;i++){ 10 x = iterete(x); 11 } 12 } 13 14 15 public static double iterate(double x){ 16 17 double xnew = 0;//update後のパラメータ 18 List<int[]> sampleSet = new ArrayList<int[]>(); 19 ...//sampleSet.get(i)はi番目のスレッドが担当するデータ番号の組が入るようにする。sampleSet.size()=threadNum 20 21 //multi threadで計算する部分 22 ExecutorService threadpool = Executors.newCachedThreadPool(); 23 List<Future<Double>> futures = new ArrayList<>(); 24 List<Double> result = new ArrayList<Double>(); 25 for(int i = 0; i < threadNum;i++){ 26 futures.add(threadpool.submit(new EachThreadCal(sampleSet.get(i),x))); 27 } 28 29 try{ 30 threadpool.shutdown(); 31 for(int i = 0; i < threadNum; i++){ 32 //結果の取得 33 result.add(futures.get(i).get()); 34 } 35 36 for(Double s: result){ 37 //結果の表示 38 System.out.println(s); 39 xnew += s;//パラメータは計算結果の平均値、というプログラムなので全部足して後で割ることにしています 40 } 41 42 }catch(InterruptedException | ExecutionException e){ 43 e.printStackTrace(); 44 threadpool.shutdown(); 45 } 46 47 return xnew/sampleNum; 48 49 } 50 51} 52 53class EachThreadCal implements Callable<Double>{ 54 private int[] samples;//担当するサンプルの番号の配列が入る 55 private double x;//前回のパラメータの値が入る 56 57 public EachThreadCal(int[] samples,double x){ 58 this.samples = samples; 59 this.x = x; 60 } 61 62 @Override 63 public Double call() throws Exception {//個々の計算 パラメータxを更新してxnewを計算する部分 64 double xnew = 0; 65 for(int i=0;i<samples.length;i++){//担当するサンプルデータに対してパラメータxnewを計算して全部足す 66 xnew += ...//samples.get(i)番目のデータ(外部から読み込む)とパラメータxを使ってxnew を計算する 67 } 68 69 return xnew; 70 } 71}
###試したこと
スレッドの数threadNumを変えて試してみましたが改善しませんでした。
WindowsのタスクマネージャからCPU優先度を最大にしても改善しませんでした。
CPU以外のリソースも不足しているわけではないようです。
###補足情報(言語/FW/ツール等のバージョンなど)
【環境】
Product Version: NetBeans IDE 8.1 (Build 201510222201)
Java: 1.8.0_91; Java HotSpot(TM) 64-Bit Server VM 25.91-b14
Runtime: Java(TM) SE Runtime Environment 1.8.0_91-b14
System: Windows 10 version 10.0 running on amd64; MS932; ja_JP (nb)
Processor: Intel(R) Xeon(R) CPU E5-2687W v4 @ 3.00 GHz, 3001Mhz, 12 core, 24 logical processor × 2
メモリ:128 GB
回答2件
あなたの回答
tips
プレビュー