Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 并行STXXL向量初始化_C++_Multithreading_Parallel Processing_Openmp_Stxxl - Fatal编程技术网

C++ 并行STXXL向量初始化

C++ 并行STXXL向量初始化,c++,multithreading,parallel-processing,openmp,stxxl,C++,Multithreading,Parallel Processing,Openmp,Stxxl,以下示例演示了stxxl在并行初始化容器(使用openMP)时的行为: 或 如何在多个线程中分配stxxl容器?stxxl容器的初始化不是线程安全的,因此需要对初始化容器的线程进行互斥。使用openMP,其内容如下: #include <omp.h> #include <stdio.h> #include <stxxl.h> typedef stxxl::VECTOR_GENERATOR<float>::result VEC_T; int ma

以下示例演示了stxxl在并行初始化容器(使用openMP)时的行为:


如何在多个线程中分配stxxl容器?

stxxl容器的初始化不是线程安全的,因此需要对初始化容器的线程进行互斥。使用openMP,其内容如下:

#include <omp.h>
#include <stdio.h>
#include <stxxl.h>

typedef stxxl::VECTOR_GENERATOR<float>::result VEC_T;

int main(int argc, char* argv[]) {
    const unsigned long NUM = 8;
    #pragma omp parallel num_threads(NUM) 
    {
            VEC_T* v;
            #pragma omp critical
            {
                    v = new VEC_T();
            }
            printf("%d\t%p\n", omp_get_thread_num(), &v);
            delete v;
    }
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
typedef stxxl::向量生成器::结果向量;
int main(int argc,char*argv[]){
const unsigned long NUM=8;
#pragma omp并行num_线程(num)
{
向量T*v;
#pragma-omp-critical
{
v=新向量;
}
printf(“%d\t%p\n”,omp\u get\u thread\u num(),&v);
删除第五条;
}
返回退出成功;
}

当然,如果循环的全部目的是构造这些容器,在OpenMP中运行与串行运行相比,基本上没有任何好处,因为这里的串行与并行工作的比率。只是一个关于并行初始化概念的最小示例。您确定向量的初始化确实不是线程安全的吗?声称从并发线程访问不同的数据结构是可以的。我的猜测是STXXL的第一次初始化不是线程安全的。当我添加一个
VEC\u在并行部分之前,我不再得到任何错误。
[STXXL-ERROR] File too large 
[SYSTEM-ERROR]Segmentation fault
#include <omp.h>
#include <stdio.h>
#include <stxxl.h>

typedef stxxl::VECTOR_GENERATOR<float>::result VEC_T;

int main(int argc, char* argv[]) {
    const unsigned long NUM = 8;
    #pragma omp parallel num_threads(NUM) 
    {
            VEC_T* v;
            #pragma omp critical
            {
                    v = new VEC_T();
            }
            printf("%d\t%p\n", omp_get_thread_num(), &v);
            delete v;
    }
    return EXIT_SUCCESS;
}