Visual Studio2019でC++を使ってプログラムを書いています。
mp.cpp
1#include <iostream> 2#include <stdio.h> 3#include <stdlib.h> 4#include<time.h> 5 6int main() { 7 int i, j; 8 double k = 0; 9 clock_t start = clock(); 10#pragma omp parallel for 11 for (i = 0; i <1000000 ; i++) { 12 for (j = 0; j < 100; j++) { 13#pragma omp atomic 14 k += sqrt(i)-j; 15 } 16 } 17 clock_t end = clock(); 18 19 const double time = static_cast<double>(end - start) / CLOCKS_PER_SEC * 1000.0; 20 printf("time %lf[ms]\n", time); 21 printf(" k = %lf,\n", k); 22}
notmp.cpp
1#include <iostream> 2#include <stdio.h> 3#include <stdlib.h> 4#include<time.h> 5 6int main() { 7 int i, j; 8 double k = 0; 9 clock_t start = clock(); 10 for (i = 0; i <1000000 ; i++) { 11 for (j = 0; j < 100; j++) { 12 k += sqrt(i)-j; 13 } 14 } 15 clock_t end = clock(); 16 17 const double time = static_cast<double>(end - start) / CLOCKS_PER_SEC * 1000.0; 18 printf("time %lf[ms]\n", time); 19 printf(" k = %lf,\n", k); 20}
mp.cppが並列化したプログラムで、notmp.cppが同じ内容で非並列化のプログラムです。
実際に実行してみた出力結果は、
mp.cppの場合
1time 17765.000000[ms] 2k = 61624080556.706154
notmp.cppの場合
1time 1515.000000[ms] 2k = 61716616645.940987
となって、並列化しない場合のほうが10倍近く高速であるという結果になりました。
また、計算結果についても、notmp.cppでは何度やっても全く同じ結果が出力されるのに対して、
mp.cppではプログラムを動かすたびに違う結果が出てきます。
(誤差ではある。例えば61656649114.643929)
以上、余計に時間がかかる。計算結果が正確ではない。の二つの問題があり、この原因と解決策を知りたくて質問させていただきました。どうかよろしくお願いします。