C++ 在OpenMP中共享作用域变量

C++ 在OpenMP中共享作用域变量,c++,c,multithreading,openmp,shared-memory,C++,C,Multithreading,Openmp,Shared Memory,我正在使用OpenMP,希望在线程之间共享在作用域块内声明的变量。以下是我所做工作的总体思路: #pragma omp parallel { // ...parallel code... { uint8_t* pixels; int pitch; #pragma omp barrier #pragma omp master { // SDL video code must be run in main thr

我正在使用OpenMP,希望在线程之间共享在作用域块内声明的变量。以下是我所做工作的总体思路:

#pragma omp parallel
{
    // ...parallel code...
    {
        uint8_t* pixels;
        int pitch;
#pragma omp barrier
#pragma omp master
        {
            // SDL video code must be run in main thread
            SDL_LockTexture(renderTexture.get(), nullptr, (void**)&pixels, &pitch);
        }
#pragma omp barrier
        // parallel code that reads `pixels` and `pitch` and writes to texture
#pragma omp barrier
#pragma omp master
        {
            // Once done, main thread must do SDL call again (this will upload texture to GPU)
            SDL_UnlockTexture(renderTexture.get());
        }
    }
}

按原样编译时,
像素
间距
将是线程专用的,并且仅在主线程中设置,从而导致segfault。有没有一种方法可以共享这些变量而不增加它们的范围(在
#pragma omp parallel
之前声明它们)或不必要地连接和重新创建线程(离开并行部分并进入另一个
#pragma omp parallel
块)?

克服此问题的一种方法是使用OpenMP任务。以下是一个例子:

#pragma omp并行
{
//…并行代码。。。
//可能不需要
#布拉格奥姆普屏障
#pragma-omp-master
{
uint8_t*像素;
int音高;
//SDL视频代码必须在主线程中运行
SDL_LockTexture(renderTexture.get(),nullptr,(void**)和像素,以及间距);
//请注意,默认情况下,taskloops的变量是firstprivate
//共享变量必须在这里显式地列为共享变量
//(与用于的omp相反)。
#pragma omp taskloop折叠(2)firstprivate(像素、间距)

对于(int y=0;yA
#pragma omp barrier
在最后一个
#pragma omp master
之后丢失,因为变量可以在到达
#pragma omp parallel
部分的末尾之前到达其作用域的末尾。最后,您想将另一个并行部分放在哪里?@JérômeRichard不在堆栈上分配变量不管是哪种方式,POD类型都不会被破坏?正如我在问题中所写的,我不想把另一个平行部分放在这里,显示的代码中有一个问题。谢谢,我已经研究了OpenMP任务,它们似乎非常有用!有一件事你似乎忘记了:
pragma omp taskwait
必须在
SDL\U之前使用nlockTexture
调用以确保任务已完成。@ValsaySrestatemonica我认为您不需要taskwait,因为任务循环创建了一个任务组(除非有notaskgroup子句),因此所有任务都将在初始线程离开任务组之前完成。()“当前任务在任务计划点挂起,直到任务组中的所有任务集完成执行。”)