C++ 并行STXXL向量初始化
以下示例演示了stxxl在并行初始化容器(使用openMP)时的行为: 或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容器?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;
}