相关疑难解决方法(0)

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

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

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

一切都按预期工作.但如果相反我动态分配,

int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)
Run Code Online (Sandbox Code Playgroud)

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

c malloc parallel-processing openmp

12
推荐指数
2
解决办法
3万
查看次数

OpenMP中预先分配的私有std :: vector并行化为C++中的循环

我打算使用缓冲区std::vector<size_t> buffer(100),在循环并行化的每个线程中使用一个缓冲区,如此代码所示:

std::vector<size_t> buffer(100);
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
    // ... code using the buffer ...
}
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.虽然每个线程都有一个缓冲区,但它们的大小为0.

如何在每个线程的开头分配缓冲区?我还能用#pragma omp parallel for吗?我可以比这更优雅地做到这一点:

std::vector<size_t> buffer;
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
    if(buffer.size() != 100) {
        #pragma omp critical
        buffer.resize(100);
    }
    // ... code using the buffer ...
}
Run Code Online (Sandbox Code Playgroud)

c++ for-loop openmp stdvector

6
推荐指数
2
解决办法
4882
查看次数

标签 统计

openmp ×2

c ×1

c++ ×1

for-loop ×1

malloc ×1

parallel-processing ×1

stdvector ×1