FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

OpenMPを使ったプログラムはどのくらいスケーラビリティがあるのか(2)

OpenMPを使った並列プログラムを試していて,いろいろ疑問に思ったことなのだが,場合によっては全然性能が上がらないことがある.

msyksphinz.hatenablog.com

std::vectorとかでもちゃんと動作するのか確かめた.

Time : 1.52998  // Thread-1
Time : 1.17349  // Thread-2
Time : 1.16384  // Thread-4
Time : 1.32109  // Thread-8

うーん,前回のstd::vector版よりも絶対性能が少し低い?それでも,一応スケールはしているような気がしている.

int main(int argc, char *argv[]) {
  char *e;

  const int nthread = strtol(argv[1], &e, 10);
  const int seed = strtol(argv[2], &e, 10);
  const int SIZE = strtol(argv[3], &e, 10);

  std::cout << "SIZE = " << SIZE << std::endl;

  std::vector<float> x;
  std::vector<float> y;
  std::vector<float> z;
  // ループの初期化                                                                                                                                                                                                                                                                                                                                                                       
  for (int i=0; i<SIZE; i++) {
    x.push_back(i + seed);
    y.push_back(i * 2 + seed);
    z.push_back(0);
  }

  printf("# of threads: %d\n", nthread);
  printf("# of processors: %d\n", omp_get_num_procs());

  omp_set_num_threads(nthread);

  double st = omp_get_wtime();

#pragma omp parallel
  {
#pragma omp for
    for (int i=0; i < SIZE; i++) {
      z[i] = x[i] + y[i];
    }
  }

  double en = omp_get_wtime();

  std::cout << "finished\n";

  std::ofstream ofile ("result.txt");

  for (int v = 0; v < SIZE; ++v) {
    ofile << z[v] << std::endl;
  }
  ofile.close();

  std::cout << "Time : " << (en-st)*1000.0 << '\n';
  return 0;
}