OpenMP的关键性能优于原子

时间:2018-04-12 02:44:10

标签: openmp atomic critical-section

我正在尝试使用代码 https://github.com/joeladams/patternlets/blob/master/patternlets/openMP/14.mutualExclusion-critical2/critical2.c 证明Critical更耗时,但我不断得到结果,其中关键的执行时间比Atomic快。任何人都知道它是如何发生的?

d[stringName.c_str()]["name"].GetString());

我的结果是:

// simulate many deposits using atomic
startTime = omp_get_wtime();
#pragma omp parallel for 
for (i = 0; i < REPS; i++) {
    #pragma omp atomic
    balance += 1.0;
}
stopTime = omp_get_wtime();
atomicTime = stopTime - startTime;
print("atomic", REPS, balance, atomicTime, atomicTime/REPS);


// simulate the same number of deposits using critical
balance = 0.0;
startTime = omp_get_wtime();
#pragma omp parallel for 
for (i = 0; i < REPS; i++) {
     #pragma omp critical
     {
         balance += 1.0;
     }
}
stopTime = omp_get_wtime();
criticalTime = stopTime - startTime;
print("critical", REPS, balance, criticalTime, criticalTime/REPS);

谢谢!

1 个答案:

答案 0 :(得分:-1)

我猜想增加浮点数与增加整数是不同的。这取决于CPU体系结构。当我用整数测试时,可以。

看看我的结果:原子比临界快两倍以上,但是与不使用原子和临界相比,它仍然慢得多,即使结果不正确。

因此,如果可能的话,请尽量避免使用锁,关键,原子锁。

测试结果:

无原子,严重:6666667、0.000113381

atomic:10000000,0.399095

严重:10000000,0.999381