2016-10-13 10 views
4

私はC++を初め、Pythonの長い背景から来ています。C++でのPythonライクなマルチプロセッシング

私はC++で並列に関数を実行する方法を探しています。私はstd::asyncについてたくさん読んでいますが、それでも私にとってはそれほど明確ではありません。

Message from main. 
Async call 

しかし、時には、私はこのような何かを得る:私は時々、出力は私が期待したものであることを複数回実行した場合

  1. 次のコードは、いくつかの本当に面白いこと

    #include <future> 
    #include <iostream> 
    
    void called_from_async() { 
        std::cout << "Async call" << std::endl; 
    } 
    
    int main() { 
        //called_from_async launched in a separate thread if possible 
        std::future<void> result(std::async(called_from_async)); 
    
        std::cout << "Message from main." << std::endl; 
    
        //ensure that called_from_async is launched synchronously 
        //if it wasn't already launched 
        result.get(); 
    
        return 0; 
    } 
    

    を行います:

    MAessysnacg ec aflrlom main. 
    

    なぜcoutが最初に起こるのですか? coutの後に.get()メソッドを呼び出すことは明らかです。

  2. パラレル実行について。

    #include <future> 
    #include <iostream> 
    #include <vector> 
    
    int twice(int m) { 
        return 2 * m; 
    } 
    
    int main() { 
        std::vector<std::future<int>> futures; 
    
        for(int i = 0; i < 10; ++i) { 
        futures.push_back (std::async(twice, i)); 
        } 
    
        //retrive and print the value stored in the future 
        for(auto &e : futures) { 
        std::cout << e.get() << std::endl; 
        } 
    
        return 0; 
    } 
    

    twice機能へのすべての10回のコールが同時に別々のコア上で実行されます場合、私はこのようなコードがありますか?

    そうでない場合は、Python マルチプロセス libのようなC++に類似のものがありますか?

    主に私が探しています何:

    私は関数を記述し、マルチプロセッシングと入力のn個の数とそれを呼び出しますか?同時にn個のノードに対して関数を1回実行します。

+3

'std :: cout'は内部的に同期されているので、結果は**発生しません**。これは実際にあなたが見ている正確な結果ですか?もしそうなら、それはコンパイラのバグです。 - もう1つのコメントは、投稿しているコードに行番号を追加しないでください。他の人がコピー&ペーストしてコードを試してみるのは難しくなります。 –

+0

** 1 **について:あなたはパラレルで物事を実行したい、そしてパラレルで走っているときにあなたは驚いていますか? – Biffen

+0

@Biffen私は驚くことではありませんが、最初の 'cout'は並列ではなく、並列プロセスは' cout'の後にのみ呼び出されます。それは混乱しているものです。 –

答えて

5

1)result.get();はスレッドを開始しません。結果はのみを待ちます。並列スレッドは、std::async(called_from_async)コール(またはコンパイラが決定するたびに)で起動されます。

std::coutは内部的にスレッドセーフであることが保証されています。したがって、を表示している結果では、は起こりません。競合状態がありますが、そのような両方の出力を混在させることはできません。それが本当に起こるなら(私が疑う)、あなたはコンパイラのバグを扱っているかもしれません。

2)通話はパラレルに実行されます。いくつのコアがOSやマシン上で実行されている他のプロセスに依存しているか。しかし、すべてが使用される可能性は十分にあります(生態系全体を制御し、他のCPU集約型プロセスはバックグラウンドで実行されていないと仮定します)。

C++用のマルチプロセッシングライクなlib(少なくともstdにはない)はありません。サブプロセスを実行する場合は、いくつかのオプションがあります。 forkingまたはpopen syscalls。

+0

パーフェクト、ありがとう。もう1つ質問:使用したいコアの数を何とか指定することはできますか?あるいは、C++は利用可能なすべてのコアを使用しますか? –

+1

@GáborErdősこれは、使用しているOSによってまったく異なります。いくつかは、手動でコアを選ぶ能力を与えるかもしれません。 AFAIKは、POSIXとWindowsの両方で可能ですが、私はその道を踏み出すことはありません。これは面倒で、カーネルに関する多くの知識が必要です。マルチプロセッシングは同じ問題を扱うことにも注意してください。 – freakish

+0

HPCでスクリプトを使用する予定があるので、私は尋ねるだけです。利用可能なすべてのコアを使用している場合は、私のためのokeyです、ちょうど興味があった。 Pythonのマルチプロセッシングでは 'Pool(4)'を定義することができ、4つのコアで動作します。 –

関連する問題