如何确保动态分配的数组在openmp中是私有的

我在C上使用gcc在linux机器上使用openMP工作。 在openmp并行for循环中,我可以声明静态分配的数组为private。 考虑一下代码片段:

int a[10];
#pragma omp parallel for shared(none) firstprivate(a)
for(i=0;i<4;i++){

一切都按预期工作。 但是如果我动态地分配,

int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)

a(至少a [1 ... 9])的值不受保护,但表现得好像它们是共享的一样。 这是可以理解的,因为编译指令中的任何内容似乎都没有告诉omp数组需要是多大才是私有的。 我怎样才能将这些信息传递给openmp? 我如何将整个动态分配的数组声明为私有?


我不认为你这样做 - 我使用并行区域#pragma omp parallel shared(...) private(...)并且在并行区域内动态分配数组。 尝试这个:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

/* compile with gcc -o test2 -fopenmp test2.c */

int main(int argc, char** argv)
{
    int i = 0;
    int size = 20;
    int* a = (int*) calloc(size, sizeof(int));
    int* b = (int*) calloc(size, sizeof(int));
    int* c;

    for ( i = 0; i < size; i++ )
    {
        a[i] = i;
        b[i] = size-i;
        printf("[BEFORE] At %d: a=%d, b=%dn", i, a[i], b[i]);
    }

    #pragma omp parallel shared(a,b) private(c,i)
    {
        c = (int*) calloc(3, sizeof(int));

        #pragma omp for
        for ( i = 0; i < size; i++ )
        {
            c[0] = 5*a[i];
            c[1] = 2*b[i];
            c[2] = -2*i;
            a[i] = c[0]+c[1]+c[2];

            c[0] = 4*a[i];
            c[1] = -1*b[i];
            c[2] = i;
            b[i] = c[0]+c[1]+c[2];
        }

        free(c);
    }

    for ( i = 0; i < size; i++ )
    {
        printf("[AFTER] At %d: a=%d, b=%dn", i, a[i], b[i]);
    }
}

这对我来说产生了与我之前的实验计划相同的结果:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

/* compile with gcc -o test1 -fopenmp test1.c */

int main(int argc, char** argv)
{
    int i = 0;
    int size = 20;
    int* a = (int*) calloc(size, sizeof(int));
    int* b = (int*) calloc(size, sizeof(int));

    for ( i = 0; i < size; i++ )
    {
        a[i] = i;
        b[i] = size-i;
        printf("[BEFORE] At %d: a=%d, b=%dn", i, a[i], b[i]);
    }

    #pragma omp parallel for shared(a,b) private(i)
    for ( i = 0; i < size; i++ )
    {
        a[i] = 5*a[i]+2*b[i]-2*i;
        b[i] = 4*a[i]-b[i]+i;
    }

    for ( i = 0; i < size; i++ )
    {
        printf("[AFTER] At %d: a=%d, b=%dn", i, a[i], b[i]);
    }
}

在猜测我会说,因为OpenMP不能推断数组的大小它不能私有 - 只有编译时数组可以这样做。 当我试图私有一个动态分配的数组时,我得到了segfaults,可能是因为访问冲突。 在每个线程上分配数组就好像您使用pthreads编写这个数组是合理的并解决了这个问题。


你告诉OpenMP指针a是私有的,即在每个线程中复制。 你的数组只是一些任意的数据a点,和OpenMP不会复制它(也许是因为这将使得有必要分配和释放的复制阵列)。

链接地址: http://www.djcxy.com/p/13897.html

上一篇: How to ensure a dynamically allocated array is private in openmp

下一篇: Programmatically get the cache line size?