我尝试使用来自https://github.com/joeladams/patternlets/blob/master/patternlets/openMP/14.mutualExclusion-critical2/critical2.c的代码来证明Critical更耗时,但我一直得到的结果是critical的执行时间比原子更快。有人知道这是怎么发生的吗?
// 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);我的结果是:
After 1000000 $1 deposits using 'atomic':
- balance = 1000000.00,
- total time = 0.421999931335,
- average time per deposit = 0.000000422000
After 1000000 $1 deposits using 'critical':
- balance = 0.00,
- total time = 0.265000104904,
- average time per deposit = 0.000000265000谢谢!
发布于 2019-08-27 23:32:48
我猜增加浮点数和增加整数是不同的。这取决于CPU架构。当我用整数进行测试时,它是可以的。
看我的结果:原子比critical快了一倍多,但与不使用原子和critical相比,它仍然慢得多,甚至结果也不正确。
所以,如果可能的话,尽量避免锁、关键、原子。
测试结果:
不含原子,临界: 6666667,0.000113381
原子: 10000000,0.399095
严重: 10000000,0.999381
https://stackoverflow.com/questions/49787162
复制相似问题