0

私は大きな配列を持っており、それを繰り返して作業を行うのに約50ミリ秒かかります。私が開発中のアプリは、tegra3 またはその他の高速 CPU で実行されます。pthread を使用して作業を 4 つのスレッドに分割しました。配列の幅を取得し、それをシステムで見つかった合計コア数で割って、各スレッドで配列の 4 分の 1 を反復処理しています。すべて問題ありませんが、仕事をするのに80msが必要です。マルチスレッドのアプローチがシングルスレッドよりも遅い理由は何ですか? CPU カウントを 1 に下げると、すべてが 50ms に戻ります。

for(int y = 0; y<height;y++)
{
    for(int x = 0; x<width; x++)
    {
        int index = (y*width)+x;
        int sourceIndex = source->getIndex(vertex_points[index].position[0]/ww, vertex_points[index].position[1]/hh);
        vertex_points[index].position[0]+=source->x[sourceIndex]*ww;
        vertex_points[index].position[1]+=source->y[sourceIndex]*hh;
    }   

};

上記のコードの最初の for ループを、CPU 数に基づいて 4 つの部分に分割しています。vertex_points は、位置を持つベクトルです。

だからそれは

for(int y=start;y<end;y++)

開始/終了はスレッドごとに異なります

4

1 に答える 1

2

スレッドの起動時間は通常、ミリ秒単位です。これが時間を浪費しています。

それを念頭に置いて、50 ミリ秒は私が心配するような遅延ではありません。5 秒を話している場合、それは並列化の良い候補になります。

ループを頻繁に実行する必要がある場合は、早い段階でスピンアップされ、作業が完了するのを待機しているスレッドを使用するソリューションを検討してください。そのほうが速く走れます。

また、CPUは本当に4コアですか?正直なコアまたはハイパースレッディング?

于 2012-07-14T14:46:43.397 に答える