我正在尝试使用代码 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);
谢谢!
答案 0 :(得分:-1)
我猜想增加浮点数与增加整数是不同的。这取决于CPU体系结构。当我用整数测试时,可以。
看看我的结果:原子比临界快两倍以上,但是与不使用原子和临界相比,它仍然慢得多,即使结果不正确。
因此,如果可能的话,请尽量避免使用锁,关键,原子锁。
测试结果:
无原子,严重:6666667、0.000113381
atomic:10000000,0.399095
严重:10000000,0.999381