10

R を使用してシェープファイルを変換しています。R はプロセッサの 1 つのコアだけを使用してこれを実行します。並列処理を使用して高速化したいと考えています。だから私はこのようにプロセスを並列化しました。

変換filesするファイルのリストを指定すると、次のようになります。

library(doMC)
registerDoMC()

foreach(f=files) %dopar% {
  # Code to do the conversion
}

これは問題なく動作し、2 つのコアを使用します。のドキュメントによると、registerDoMC()デフォルトでは、その関数はparallelパッケージによって検出されたコアの半分を使用します。

私の質問は、すべてのコアではなく半分のコアを使用する必要があるのはなぜですか? (この場合は 4 コアです。) この機能registerDoMC(detectCores())を使用することで、システムのすべてのコアを使用できます。もしあれば、これを行うことの欠点は何ですか?

4

5 に答える 5

9

スケーラビリティの問題の他に、単純なルールがあります。少なくとも Windows では、Intel ハイパースレッディング コアは役に立ちません。したがって、detectCores() で 8 を取得しますが、4 コアを超えると、一般的に完全にスケーリングする MCMC 並列スレッドを使用しても、改善が見られませんでした。

誰かが (Windows で) ハイパースレッディングによってそのような改善が見られる場合は、投稿してください。

于 2013-08-17T17:21:36.517 に答える
8

並列処理を行うときは常に、いくらかのオーバーヘッドがあります (これは、特にデータ構造のロックと呼び出しのブロックの場合に重要です)。小さなバッチ ジョブの場合、1 つのコアまたは 2 つのコアで実行すると、そのオーバーヘッドが発生しないため、はるかに高速になります。

ジョブのサイズはわかりませんが、システムの最大コア数 (通常は、常にプロセッサー数を 2 倍にします)。編集: 4 つのコアしか使用していないように見えるので、1、2、および 4 で時間を計ってください。

コア数ごとに最大 32 回の試行のタイミング結果を実行し、信頼区間を取得すると、すべてのコアで実行することが適切かどうかを確実に判断できます。ジョブに時間がかかる場合は、試行回数を 5 回程度まで減らしますが、試行回数が多いほど信頼度が高くなることを覚えておいてください。

詳しく説明するには:

スチューデントの t 検定:

スチューデントの t 検定は、基本的に「このコア数の平均時間を計算しましたが、それは真の平均ではありません。真の平均を取得できるのは、無数のデータ ポイントの平均が得られた場合のみです。計算された真の平均は、実際には計算された平均の周りにある間隔にあります」

有意性の t 検定は、基本的に 2 つのデータポイントの真の平均付近の間隔を比較し、それらが有意に異なるかどうかを示します。したがって、ある平均時間が別の平均時間よりも短い場合がありますが、標準偏差が十分に高いため、実際に短いとは言えません。真の平均は同じかもしれません。

したがって、この検定の有意性を計算するには、次のようにします。

  • タイミング実験を実行する
  • コア数ごとに:
  • 平均と標準偏差を計算します。標準偏差は、母集団分散の平方根である母集団標準偏差である必要があります。母分散は (1/N) * summation_for_all_data_points((datapoint_i - mean)^2) です。

これで、各コア カウントの平均偏差と標準偏差が得られます: (m_1, s_1)、(m_2, s_2) など。 - コア カウントのすべてのペアについて: - t 値を計算します: t = (mean_1 - mean_2) /(s_1/sqrt(#データポイント))

ここで示した t 値の例では、コア数 1 の平均タイミング結果がコア数 2 のタイミング結果と大きく異なるかどうかをテストしています。

t = (m_2 - m_1)/(s_2/ sqrt(#dataPoints))

これらの t 値を計算したら、重要値の表を見て、それらが有意であるかどうかを判断できます。ここで、それをクリックする前に、さらに 2 つのことを知っておく必要があります。

自由度

これは、所有しているデータポイントの数に関連しています。データポイントが多いほど、平均前後の間隔が小さくなる可能性があります。自由度は、計算された平均の移動能力を測定するものであり、それは #dataPoints - 1 (私が提供したリンクのv ) です。

アルファ

アルファは確率のしきい値です。ガウス (通常、釣鐘曲線) 分布では、アルファは左右の釣鐘曲線をカットします。カットオフの中間にある確率はしきい値内にあり、重要でない結果です。アルファが低いほど、有意な結果を得ることが難しくなります。つまり、アルファ = 0.01 は確率の上位 1% のみが重要であることを意味し、アルファ = 0.05 は上位 5% を意味します。ほとんどの人は alpha = 0.05 を使用します。

リンク先の表では、1-alpha によって、重要な値を探して下に移動する列が決まります。(したがって、alpha = 0.05 は 0.95、つまり 95% の信頼区間を与えます)、vは自由度、つまり注目する行です。

臨界値が計算されたt (絶対値)より小さい場合、結果は重要ではありません。臨界値が計算されたt (絶対値)より大きい場合、統計的有意性があります。

編集: スチューデントの t 検定では、比較される 2 つの平均値の間で分散と標準偏差が同じであると想定されます。つまり、真の平均の周りのデータ ポイントの分布が等しいと仮定します。この仮定をしたくない場合は、わずかに異なるWelch の t-testを探しています。wiki ページには、このテストの t 値を計算するための適切な式があります。

于 2013-08-17T16:14:34.970 に答える
6

回避したい状況が 1 つあります。

  • N 個のコアすべてにタスクを分散する

  • すべてのコアで OpenBLAS や MKL などを使用して、各コアにタスクを実行させる

これは、N 対 N の競合が発生したためです。N タスクのそれぞれは、その線形代数の計算結果を N コアすべてにファームしようとしています。

もう 1 つの (些細な) 反例は、マシン上のすべての M ユーザーが (同時に) N コアにファームアウトできるわけではないマルチユーザー環境で提供されます。

于 2013-08-17T18:04:02.253 に答える
4

使用可能なすべてのコアを使用しないもう 1 つの理由は、タスクが大量のメモリを使用し、その数のワーカーをサポートするのに十分なメモリがない場合です。与えられた量のメモリでサポートできるワーカーの数を判断するのは難しい場合があることに注意してdoMCくださいmclapply

この質問への回答から、使用するワーカーの適切な数を把握するのが必ずしも容易ではないことは明らかです。デフォルト値はあってはならず、ユーザーは数値を指定するように強制されるべきだと主張する人もいるかもしれませんが、そこまで行くかどうかはわかりません。いずれにしても、半分の数のコアを使用することについて、それほど魔法のようなことはありません。

于 2013-08-18T02:26:33.337 に答える
2

うーん。私は並列処理の専門家ではありませんが、すべてのコアを使用することのマイナス面は、他のことをしようとしたときにマシンの速度が低下することだといつも思っていました。すべてのコアを使用したときに、個人的にこれが発生したことがあります。そのため、現在、私の習慣は、何かを並行して実行しているときに、8 つのコアのうち 7 つを使用し、1 つのコアを他のことのために残しています。

于 2013-08-17T22:06:19.457 に答える