[英]How to use lock in OpenMP?
我有兩段 C++ 代碼在 2 個不同的內核上運行。 它們都寫入同一個文件。
如何使用 OpenMP 並確保沒有崩潰?
您需要OMP_SET_LOCK
/ OMP_UNSET_LOCK
功能: https : OMP_UNSET_LOCK
基本上:
omp_lock_t writelock;
omp_init_lock(&writelock);
#pragma omp parallel for
for ( i = 0; i < x; i++ )
{
// some stuff
omp_set_lock(&writelock);
// one thread at a time stuff
omp_unset_lock(&writelock);
// some stuff
}
omp_destroy_lock(&writelock);
盡管特定的 API 調用不同,但大多數鎖定例程(例如 pthreads 信號量和 sysv 信號量)都適用於這種邏輯。
為了后來者的利益,使用critical
是另一種選擇。 您甚至可以創建命名的臨界區。
例如:
#include <omp.h>
void myParallelFunction()
{
#pragma omp parallel for
for(int i=0;i<1000;++i)
{
// some expensive work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
// other work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
}
}
編輯:Victor Eijkhout 發起的評論中有一個很好的線索。 總結和釋義:簡而言之, critical
鎖定一個代碼段。 在更復雜的示例中,您要做的只是鎖定特定數據項,這可能有點過頭了。 在這兩種方法之間做出選擇之前,了解這一點很重要。
#pragma omp critical
{
// write to file here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.