0

私は並列ループ (C++11) について勉強し、MS Visual Studio 2013 でそれらをテストしてきました。

しかし、私の懸念は、単純なユークリッド距離測定を実行する関数を呼び出さなければならないことです。関数自体は明らかですが、関数を Euc​​lideanDistance というクラスに移動し、関数Match(vectorA,vectorB)内で 2 つのベクトルに対してユークリッド数学を実行する必要があります 。これは単にノルム (...) 計算です。浮動小数点値。

では、parallel_for/parallel_foreach ループ内でこれを行うにはどうすればよいでしょうか。ループ内でクラス オブジェクトを作成しますか?それとも、クラス オブジェクトをループ外に保持すると矛盾が生じますか? 並列ループについて正しく理解していれば、それが機能する関数は基本的に、起動されたすべてのスレッドのクリーン コピーです。これはクラス関数の場合に起こりますか? 私の予感はノーです!2 番目のコード スニペットに示すように、クラス内にオブジェクトを作成しない限り。

例: 読みやすくするために、コードを省略しています。

vectorA; // Floating point array of 1024 entries.
concurrent_queue vectorQ; // each entry in the queue is a 1024 array
EuclideanDistance euclid;
parallel_for_each(begin,end,[&](auto item)
{
    auto distance = euclid.Match(vectorA,item);
});

それとも、これが正しい方法でしょうか?

parallel_for_each(begin,end,[&](auto item)
{
EuclideanDistance euclid;
    auto distance = euclid.Match(vectorA,item);
});

クラス全体は、単一の関数にすぎません。

    class EuclideanDistance
    {
public:
       float Match(vectorA,vectorB)
        {
           return norm(vectorA,vectorB); 
        }
    };

どんな落とし穴でも大歓迎です!

4

1 に答える 1