計算に並列スレッドを使用するレコメンデーション エンジンのコードを書いています。実行中、8 コア CPU で (top コマンドを使用して) 265 ~ 300% の最大 CPU 使用率が得られます。私が得ていないのは、CPU の 50% 近くがアイドル状態であっても、CPU をフルに使用していない理由です。並列処理を使用する疑似コード部分は次のとおりです。
getRecoFromCandidates(){
t=new Thread(new KNN(uid,profile,candidates));// does knn using closest neighbors
rec=RecommendationsFromSet(NB_RECOMMENDATIONS,uid,candidatesI,val);// finds recommendations
return rec;
}
RecommendationsFromSet() {
Thread worker = new Thread(new storiesClickProcess(nbRec,candidatesI,likedSet));
worker.start();
threads.add(worker);
}
int running = 0;
do {
running = 0;
for (Thread thread : threads) {
if (thread.isAlive()) {
running++;
}
}
} while (running > 0);
if(val==1){
List<Story> list1 = new ArrayList<Story>();
for(Integer sid: storiesClicks.keySet()){
list1.add(new Story(sid,storiesClicks.get(sid)));
}
Collections.sort(list1,new StoriesList());
for(i=0;i<nbRec;i++){
rec.add(list1.get(i).getSid());
}
}
return rec;
}
parGetClosestNeighbor() {
Thread worker = new Thread(new formNetworkProcess(nbFriends,networkScore[i],profile,candidatesI,candidatesISet) );
worker.start();
threads.add(worker);
}
int running = 0;
do {
running = 0;
for (Thread thread : threads) {
if (thread.isAlive()) {
running++;
}
}
} while (running > 0);
List<Network> list = new ArrayList<Network>();
for(i=0;i<TASK_NUM;i++){
for(Integer sid: networkScore[i].keySet()){
list.add(new Network(sid,networkScore[i].get(sid)));
}
}
Collections.sort(list,new NetworkList());
for(i=0;i<nbFriends;i++){
friends.add(list.get(i).getUid());
}
synchronized(network.get(uid)) {
network.get(uid).clear();
for( i=0;i<friends.size();i++){
network.get(uid).add(friends.get(i));
}
}
return friends;
}