2017-11-18 6 views
1

私は4コアを持つ私のマシン上でubuntu OSを持っています。また、def1、def2、def 3などの異なる機能を持つpython.pyというPythonスクリプトがあります。 コア1でdef1を実行し、コア2から4で残りを実行したいと考えています。 使用することができます。制御別のコアで実行するPythonコード

 #taskset -c 1 python.py 

これに伴う問題は、その内部の各機能のために一つのコア上の全スクリプトの実行を行います。しかし、私は特定のコアで特定の機能を実行したい:

 def add(a,b): 
      return a+b 

     def sub(s, t): 
      return s-t 

     def mult(y,x): 
      return y*x 

     add(3,4) # run this function on core 0 
     sub(3,4) # run this function on core 1 
     mult(2,3) # I don't core run on core 2 or 3 

私の質問は:これは可能ですか?

+1

あなた自身の質問に部分的に回答したと思います。あなたは 'subprocess'モジュールを使い、' taskset'に必要な引数を渡すことができます。それぞれの関数が独自のスクリプト内にあり、結果を消費できるようにコードを再編成する必要があります。 – dgumo

答えて

1

はい、複数のコアを利用するには、各プロセスを異なるプロセスで実行できます。次に例を示します。

from multiprocessing import Process 

def add(a,b): 
    return a+b 

def sub(s, t): 
    return s-t 

def mult(y,x): 
    return y*x 

if __name__ == "__main__": 
    # construct a different process for each function 
    processes = [Process(target=add, args=(3,4)), 
       Process(target=sub, args=(3,4)), 
       Process(target=mult, args=(2,3))] 

    # kick them off 
    for process in processes: 
     process.start() 

    # now wait for them to finish 
    for process in processes: 
     process.join() 

特定のコアで特定のプロセスを実行するように強制する必要はありません。 CPUに複数のコアがある場合、OSはそれらのコア全体でプロセスをスケジューリングします。 CPU pinningをここで実行する必要はありません。

上記の例は、複数のコアが関与しているのを見るには単純すぎます。代わりに、この例を試すことができます。この例は、上記の単純なCPUバウンド問題のバリエーションです。つまり、より多くの計算を必要とするバージョンです。

from multiprocessing import Process 


def add(a, b): 
    total = 0 
    for a1, b1 in zip(a, b): 
     total = a1 + b1 
    return total 


def sub(s, t): 
    total = 0 
    for a1, b1 in zip(s, t): 
     total = a1 - b1 
    return total 


def mult(y, x): 
    total = 0 
    for a1, b1 in zip(y, x): 
     total = a1 * b1 
    return total 


if __name__ == "__main__": 
    # construct a different process for each function 
    max_size = 1000000000 
    processes = [Process(target=add, args=(range(1, max_size), range(1, max_size))), 
       Process(target=sub, args=(range(1, max_size), range(1, max_size))), 
       Process(target=mult, args=(range(1, max_size), range(1, max_size)))] 

    # kick them off 
    for process in processes: 
     process.start() 

    # now wait for them to finish 
    for process in processes: 
     process.join() 

あなたtop出力を見て(とコアを見て1を押した)場合は、3つのコアが100%(またはそれに近い)で使用されているところ、このようなものが表示されるはずです。これは、CPUのピン割り当てを行う必要はありません。並列化を行うには、OSを信頼する方が簡単です。

enter image description here

+0

ありがとうございました。でも、どのコアを走らせなければならないのか分からないのであれば、どうやって別のコアで動くのか分かります。 – kaloon

+0

異なるコアで実行するようにOSに指示する必要はありません。複数のコアと複数のプロセスがある場合、OSはそれらのコアを使用します。 – Paul

+0

Paulに感謝します。しかし、私は、OSに異なるコアでそれらを実行するように指示する方法があるべきだと思います。 2つの機能があるので、同じコアで実行することはできません。 OSがそれらのコアを介してプロセスをスケジューリングできるようにすれば、それらが同じコアで実行されるかどうかを認めることはできません – kaloon

関連する問題