如何在 OpenMP 中使用锁?

发布于 2024-08-24 03:50:15 字数 69 浏览 7 评论 0原文

我有两段 C++ 代码在 2 个不同的内核上运行。他们都写入同一个文件。

如何使用OpenMP并确保不崩溃?

I have two pieces of C++ code running on 2 different cores. Both of them write to the same file.

How to use OpenMP and make sure there is no crash?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧城空念 2024-08-31 03:50:15

您需要 OMP_SET_LOCK/OMP_UNSET_LOCK 函数:
https://hpc.llnl.gov/tuts/openMP/#OMP_SET_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 信号量)都适用于此类逻辑。

You want the OMP_SET_LOCK/OMP_UNSET_LOCK functions:
https://hpc.llnl.gov/tuts/openMP/#OMP_SET_LOCK

Basically:

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);

Most locking routines such as pthreads semaphores and sysv semaphores work on that sort of logic, although the specific API calls are different.

你另情深 2024-08-31 03:50:15

为了后来者的利益,使用关键是另一种选择。您甚至可以创建命名的关键部分。

例如:

#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 发起的评论中有一个很棒的线索。总结和释义:简而言之,关键性锁定了一个代码段。在更复杂的示例中,您只想锁定特定的数据项,这可能有点过分了。在这两种方法之间做出选择之前,了解这一点很重要。

For the benefit of those coming after, using critical is another option. You can even make named critical sections.

For example:

#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      
        }
    }
} 

Edit: There's a great thread in the comments initiated by Victor Eijkhout. Summarizing and paraphrasing: In short critical locks a code segment. That can be overkill in more complex examples where all you want to do is lock a specific data item. It's important to understand this before you make a choice between the two methods.

奶气 2024-08-31 03:50:15
#pragma omp critical
{
    // write to file here
}
#pragma omp critical
{
    // write to file here
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文