2017-11-17 3 views
1

こんにちは私はコードを高速化できないため、現時点で非常に落ち込んでいます。 マルチプロセッサプールを使用しました。 Processornumbersのスピードアップと効果を評価するために、私は使用するプロセッサの数を変えます。しかし、プロセッサの数を増やすとスピードが落ちます。理論的に私は8つのプロセスを持っていれば8つのイメージを並列に計算し、4つのプロセスを使うなら4つを計算するのはなぜなかろうとしています。確かにオーバーヘッドがありますが、これは大きなボトルネックではありません。誰かがここで間違いを見つけますか?カインド)あなたは、あなたがPool.mapを(使用しての優れているapply_asyncで任意のコールバック関数を使用して、常に同じ機能(computeFeatures)を使用しないので、最大マルチプルプロセスを使用すると、Pythonコードの実行速度が遅くなる

''' 
Created on 17.11.2017 

@author: Max 
''' 
#!/usr/bin/env python 

import os, sys, errno 
import re 
import argparse 
from time import time 
import multiprocessing 
import glob 
import numpy as np 
import matplotlib.pyplot as plt 
import cv2 
def computeFeatures(input, chunk_num): 
    thresholded_chunk = [] 
    #print("Processing Chunk,",chunk_num) 
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV) 
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV) 
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV) 
    cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV) 
    thresholded_chunk.append(cv2.threshold(input,127,255,cv2.THRESH_BINARY_INV)) 
    return (thresholded_chunk, chunk_num) 


if __name__ == '__main__': 
    num_Proc = 2 
    max_Proc = 20 
    while num_Proc != max_Proc: 

     start = time() 
     # Handle command line options 
     numProcessors = num_Proc 

     # Start my pool 
     pool = multiprocessing.Pool(numProcessors) 

     # Build task list 
     path = "InputSimulation\*" 
     tasks = [] 
     image_list= [] 
     img_idx = 0 
     image_pathes = glob.glob(path+".jpg") 
     results = [] 
     index_for_chunk = numProcessors 
     while img_idx < len(image_pathes): 
      #print("InsterImageNumber",img_idx) 
      tasks.append((cv2.imread(image_pathes[img_idx],0), img_idx,)) 
      if img_idx % numProcessors == 0: 
       result = [pool.apply_async(computeFeatures, t) for t in tasks] 
       results.append(result) 
       tasks = [] 
      img_idx +=1 
     pool.close() 
     pool.join() 
      # Run tasks #Flatten list before print 

     end = time() 
     print("DURATION FOR " +str(num_Proc) +" PROCESSES",end - start) 
     num_Proc +=1 
     # Process results 
+0

これはハードウェアに問題がある可能性があります。GPUの仕様を含めて、実行しているマシンに仕様を投稿しますか? – Splatmistro

+3

プロセスがCPUの制限ではなくIO制限されている場合、複数のプロセスにまたがって処理すると、処理全体が遅くなることがあります。 – VBB

+0

Intel(R)Core(TM)i7-6500U CPU 2.5Ghz 2コア4ロジックプロセッサ、Windows 10,8GB RAM、Intel(R)HDグラフィック520 –

答えて

0

について。現在のユースケースでは、apply_asyncは計算を並列に実行しません。さらに、各計算にオーバーヘッドが加わります。

例:

from multiprocessing import Pool 
from math import sqrt 

p = Pool(8) 
num_list = range(100000) 

%%time 
_ = p.map(sqrt, num_list) 

CPU時間:ユーザー19ミリ秒、SYS:2.36ミリ秒、合計:21.4ミリ

壁時間:27.7秒

%%time 
_ = [sqrt(num) for num in num_list] 

CPU時間:ユーザー33.7 ms、sys:5.93 ms、合計:39.6 ms

ウォール時間:37.5ミリ

%%time 
_ = [p.apply_async(sqrt, num) for num in num_list] 

CPU時間:ユーザー5.5秒、SYS:1.37秒、合計:6.87秒

ウォール時間:5.95秒

この例で示すように。簡単な計算はPool.map()で最もうまくいきます。マップを使ってコードを変更すれば、いくらか改善が見られるかもしれません。また、あなたのシステムと問題のための正しい労働者数を見つけることも重要です。

result = pool.map(computeFeatures, tasks) 
+0

回答ありがとうございます。 map(computeFeatures、tasks)が実行されますが、その実行はさらに遅くなります。 –

関連する問題