template <classET> inlinevoidwriteAdd(ET *a, ET b){ volatile ET newV, oldV; do {oldV = *a; newV = oldV + b;} while (!CAS(a, oldV, newV)); }
intmain(){ int num[1000]; for(int i=0; i<1000; i++){ num[i] = i; } printf("init num list over.\n");
int sum=0; startTime(); for (int i = 0; i < 1000; ++i) { int t = (i * 12) % 1000; int tmp = num[t]; sum += tmp; } nextTime("base time: "); cout<<sum<<endl;
// openmp reduce sum = 0; startTime(); omp_set_num_threads(5); #pragma omp parallel for reduction(+: sum) for (int i = 0; i < 1000; ++i) { int t = (i * 12) % 1000; int tmp = num[t]; sum += tmp; } nextTime("omp time: "); cout<<sum<<endl;
// openmp & CAS sum=0; startTime(); omp_set_num_threads(5); #pragma omp parallel for for (int i = 0; i < 1000; ++i) { int t = (i * 12) % 1000; int tmp = num[t]; writeAdd(&sum, tmp); } nextTime("omp & CAS time: "); cout<<sum<<endl;
// cilk test sum=0; setWorkers(5); startTime();
cilk_for (int i = 0; i < 1000; ++i) { int t = (i * 12) % 1000; int tmp = num[t]; writeAdd(&sum, tmp); } nextTime("cilk & CAS time: "); cout<<sum<<endl;
return0; }
测试运行时间结果如下:
1 2 3 4 5 6 7 8 9
init num list over. base time: : 8.11e-06 498000 omp time: : 0.000205 498000 omp & CAS time: : 8.7e-05 498000 cilk & CAS time: : 0.000253 498000