2015-01-11 7 views
5

AWS EC2 c3で12-16コアを使用する場合より28-30コアを使用している間、計算時間が長い理由がわかりません。 8xlarge。私は13個のコアを使用する場合AWS EC2で16コアより32コアの方がPythonコードの方が遅い

https://www.dropbox.com/s/8u32jttxmkvnacd/Slika%20zaslona%202015-01-11%20u%2018.33.20.png?dl=0

最速の計算は次のとおりです。私はいくつかのテストと結果は以下の表にありました。これは、私が使用したコードのコードを簡略化されて

https://www.dropbox.com/s/gf3bevbi8dwk5vh/Slika%20zaslona%202015-01-11%20u%2018.32.53.png?dl=0

:私は最大のコアを使用するのであれば、それは私がc3.8xlargeの8つのコアを使用していますと同じ時間です。

import random 
import multiprocessing as mp 
import threading as th 
import numpy as np 

x=mp.Value('f',0) 
y=mp.Value('f',0) 
arr=[] 
tasks=[] 
nesto=[] 

def calculation2(some_array): 
    global x, y, arr 
    p=False 
    a = np.sum(some_array)*random.random() 
    b = a **(random.random()) 
    if a > x.value: 
     x.value=a 
     y.value=b 
     arr=some_array 
     p=True 
    if p: 
     return x.value, y.value, arr 

def calculation1(number_of_pool): 
    global tasks 
    pool=mp.Pool(number_of_pool) 
    for i in range(1,500): 
     some_array=np.random.randint(100, size=(1, 4)) 
     tasks+=[pool.apply_async(calculation2,args=(some_array,))] 

def exec_activator(): 
    global x, y, arr 
    while tasks_gen.is_alive() or len(tasks)>0: 
     try: 
      task=tasks.pop(0) 
      x.value, y.value, arr = task.get() 
     except: 
      pass 

def results(task_act): 
    while task_act.is_alive(): 
     pass 
    else: 
     print x.value 
     print y.value 
     print arr 

tasks_gen=th.Thread(target=calculation1,args=(4,)) 
task_act=th.Thread(target=exec_activator) 
result_print=th.Thread(target=results,args=(task_act,)) 

tasks_gen.start() 
task_act.start() 
result_print.start() 

それは2計算のコアあります:

  • 計算1 - アレイを計算し、その配列を使用して計算2 のジョブを行う
  • 計算2 - アレイの一部の計算のアウトを計算し、結果の比較

コードの目的は、最大xを計算し、そのyを返す配列を見つけることです。 2つの計算は同時に(スレッドを使用して)開始しますが、あまりにも多くのRAMを占有する配列が多すぎることがあるためです。

私の目標は、最速の計算を行うことです。可能であれば、すべてのコアを使用する方法について助言が必要です。

英語が正しくない場合は、事前にご連絡ください。より多くの情報が必要な場合は、お問い合わせください。

+0

コア数が多すぎると、使用可能なRAMと比べて、仮想メモリを使用している可能性があります(ディスクとのスワッピング、単純化のため)。一般的な解決策は、より多くのRAMを取得することです。タスクの詳細によっては、ディスクから適切なシーケンシャルな方法で実際に作業する方が、仮想的な「メモリ」にすべてを吸い込むよりも速くなる可能性があります。また、ローカルSSDを「ディスク」として使用することができれば、それははるかに高速なランダムアクセスを提供することができます(AWSで行う方法はわかりませんが、Google Cloud Platformのみ)。 –

+0

私はpsutilを使ってプロセッサとRAMを監視しています。テストされたデータでは、RAMの最大2〜3%を使用しました。私はすべてのデータとPythonコードをUbuntuサーバー(EBS)に転送します。 – matoliki

+0

興味深いトピック。あなたはどのようにテストしますか、私はそれをマイクロインスタンス上で実行し、結果を0.2 ['[86 44 89 88]]で返します。\ n real \t 0m0.175s' – BMW

答えて

2

c3.8xlargeは、Ivy Bridgeクアッドコアシステムです。それはハイパースレッディングを使用します。それは実際には32個(ハードウェア)の独立した処理ユニットを持っていません。

多くのOSプロセスでCPUバウンドタスクをハードウェア内のプロセッサよりも並列処理しようとすることはしばしばありません。実際には、リソースオーバーヘッドとコンテキスト切り替え(これはあなたが見ているものです)のために非常に有害です。

これはおそらく特定のアプリケーションに依存しており、実験によってスイートスポットが見つかるようになります。

関連する問題