「40コアを失いますか?」またはAcceler8 2011シンプルパラレルプログラミングコンテスト

Habr高等教育 について意見を述べる週を続けて、仕事(尊敬されるAlexanderLarinによって拒否された)と学習能力(ユーザーhabruzov Alexnnによって促進された)の間の競争について話します。

Acceler8 2011並列プログラミングコンテスト

そしてAcceler8並列プログラミングコンテストについて説明します。 はい、これは学ぶだけでなく、「小さな」賞品の1つであるHPのノートパソコン2台とAsusのネットブック10台で 働く機会がある競争です。

手を試してみませんか?



一見したところ、今回の競争は非常に単純です。プログラミングの問題を1つだけ解決する必要があります。

一見したところ、ソリューションは並列であり、おそらくスケーラブルでなければなりません。

それで、私たちは何について話しているのでしょうか?



タスクについて簡単に



値の2次元行列が与えられた場合、すべての部分行列の中で要素の最大和を含む長方形の部分行列を見つける必要があります。

タスクの詳細については、コンテストページをご覧ください



ソリューション概要



タスクが順次額検索によって解決されることは明らかですが、解決策は遅すぎます。

int maxSum = A[0][0]; int maxI0 = 0, maxJ0 = 0, maxI1 = 1, maxJ1 = 1; for (int i = 0; i < M; i++) for (int j = 0; j < N; j++) for (int width = 1; width <= M - i; width++) for (int height = 1; height <= N - j; height++) { int currentSum = sum_subarray(A, i, j, i + width, j + height); if (currentSum > maxSum) { maxSum = currentSum; maxI0 = i; maxJ0 = j; maxI1 = i + width - 1; maxJ1 = j + height - 1; } } cout << "Max subarray: [" << maxI0 << "][" << maxJ0 << "] .. [" << maxI1 << "][" << maxJ1 << "]"; cout << endl << "Max value = " << maxSum << endl; cout << "Area = " << (maxI1 - maxI0 + 1) * (maxJ1 - maxJ0 + 1) << endl;
      
      





明らかに、このアプローチは「まったく壮大ではありません」。



賢明な決定方法



このタスクには多くのアプローチがあります。



すべてのカードを公開するわけではありません。 今ではすべてが平等な立場にあります-1か月(決定は11月15日まで)、Googleと教科書への無料アクセス。

簡単そうですね。

そして最もおいしい-おやつに。



スケーラビリティをどのように評価しますか?



この問題には多くのアプローチと多くの洪水があります。 最も単純なソリューションを採用することにしましたが、現実に最も近いソリューションも採用しました。

コードは2つの異なるプラットフォームでテストされます。 1つは、有名なハードウェア特性、有名なプロセッサブランド、有名なサイズの2次キャッシュを備えたManycore Testing Lab 40 コアマシンです(「 MTL構成 」を参照)。 2つ目は小さなシステムです。これについてはほとんど何もわかっていません(2〜4コア、メモリのいくつかのギグ-それがすべての情報です)。

このような状況でソリューションを最適化することは困難ですか? はい

一方、「小さなマシン」やMTLの媒体では、誰よりも速く作業できます-これで十分です。

それとも、誰かが両方のマシンでより良い結果を達成するでしょうか? 時間を表示します。

だから、興味のある人のために、小さなリンク: コンテストへの登録 。 コメントに質問を書いたり、 コンテストフォーラムに行ってください



そして、それは壮大です! ;)



All Articles