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