lab/技術情報

IntelCompiler?を使ってFedora8上でopenMPを動かしてみる段

タイトルそのまんまです。

参考サイト、というか、ソースはほとんどここ。http://d.hatena.ne.jp/mir/20070823

Fedora8で私と同じ仕様で使っている人のためにちょこちょこ記事を追加しています。

目次

仕様

  • PC: DELL vostro 200
    • core2duo 2.6Ghz
    • RAM:2GB
  • OS: Fedora8
    • gcc -v
      gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33)

作業手順

  • IntelのサイトからIntelCompiler?をダウンロード&インストール
    • intelに登録が必要。レスポンスとして送られてくるメールにライセンスファイル(*.lic)が添付されている。インストール時、ライセンスを求められるので、こいつを使う。
    • デフォルトだと
      /opt/intel/icc
      のようなところにインストールされちゃいます。
  • パスを通す。
    • $HOME/.tcshrcを編集し
      setenv PATH /opt/intel/icc/bin:$PATH
      な感じで追加。
    • root権限で/etc/ld.so.confを編集し
      /opt/intel/icc/lib
      を追加。ルート権限のまま
      # ldconfig
      を実行して変更を反映させる。
  • 旧バージョンのGCCをインストール
    # yum install compat-gcc*
    IntelCompiler?は古いバージョンのコンパイラがないと使えないそうな。しゅーん。
  • 適当なソースを用意
    % cat > main.cpp
    • #include <iostream>
    • #include <vector>
    • #include <omp.h>
    • #include <math.h>
    • #define SIZE 50000000
    • using namespace std;
    • int main(){
    • double *k=new double[SIZE];
    • #pragma omp parallel for
    • for(int i=0;i<SIZE;i++){
    • k[i]=sin(4.23*(i+3));
    • k[i]+=1;
    • }
    • #pragma omp parallel for
    • for(int i=0;i<SIZE;i++){
    • k[i]*=sin(exp(sin(i)));
    • }
    • std::cout << k[SIZE-3] << std::endl;
    • delete [] k;
    • return 1;
    • }
  • コンパイル
    % icpc -fast -openmp -gcc-name=/usr/bin/gcc34 -o main main.cpp
    • 一応、ライブラリが見えているか確認
      % ldd main
      • linux-gate.so.1 => (0x00110000)
      • libm.so.6 => /lib/libm.so.6 (0x0094a000)
      • libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00111000)
      • libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00d02000)
      • libcxaguard.so.5 => /opt/intel_cc_80/icc/lib/libcxaguard.so.5 (0x001fc000)
      • libc.so.6 => /lib/libc.so.6 (0x007ef000)
      • libdl.so.2 => /lib/libdl.so.2 (0x00975000)
      • /lib/ld-linux.so.2 (0x007d0000)
    • インストール、ライブラリの設定がうまくいっていないと、上記コマンドでnot foundと起こられます。

実行

  • -openmpをつけたもの、つけなかったものを走らせてみる。
  • つけたもの
    • [mona@host:~/tmp/openmp]% time ./main
    • 123
    • 0.485679
    • 13.112u 0.264s 0:06.88 194.3% 0+0k 1336+0io 9pf+0w
  • つけなかったもの
    • [mona@hose:~/tmp/openmp]% time ./main
    • 123
    • 0.485679
    • 14.448u 0.175s 0:14.63 99.8% 0+0k 0+0io 0pf+0w
  • おぉ!たしかに速くなっとります!別窓でtopコマンドをしてみるとCPU使用率が200%とのこと。やったぜ...
  • けど、デュアルコアなのに2倍以上速くなるっておかしくね。。。?

実行2

ソースはさらしませんが.行列計算(B=A^2ってやつ)を並列化してみたが、高速化できず、それどころか遅くなった。。。コーディングの悪さもあるが、なかなか思うように自動並列化はすすんでくれない、と感じた。

まとめ

openMP、#pragmaの一撃でマルチスレッド化できるので非常に便利です。これでサクサクプログラム書くぞー

検索キー

intel compiler icpc icc openmp pragma omp parallel 自動並列化 core2 duo fedora fedora8 linux


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-29 (金) 00:23:00 (5922d)