Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ &引用;使用带OpenMP的proj4进行SEGFULT;或;如何在OpenMP中使用特定于线程的全局变量;_C++_Multithreading_Openmp_Proj - Fatal编程技术网

C++ &引用;使用带OpenMP的proj4进行SEGFULT;或;如何在OpenMP中使用特定于线程的全局变量;

C++ &引用;使用带OpenMP的proj4进行SEGFULT;或;如何在OpenMP中使用特定于线程的全局变量;,c++,multithreading,openmp,proj,C++,Multithreading,Openmp,Proj,我有大量由WGS84坐标定义的对象,我想将其转换为墨卡托空间。MWE中没有显示其他操作,这些操作阻止我以单线程方式完成所有工作 我目前的代码如下: //使用:g++-O3 temp.cpp-lproj-fopenmp编译 #包括 #包括 #包括 #包括 #包括 typedef-std::向量dvec; typedef std::pair-dvpair; //在这里定义它们,这样我们就不会每次运行'pj_transform()` const char*wgs84_str=“+init=epsg:4

我有大量由WGS84坐标定义的对象,我想将其转换为墨卡托空间。MWE中没有显示其他操作,这些操作阻止我以单线程方式完成所有工作

我目前的代码如下:

//使用:g++-O3 temp.cpp-lproj-fopenmp编译
#包括
#包括
#包括
#包括
#包括
typedef-std::向量dvec;
typedef std::pair-dvpair;
//在这里定义它们,这样我们就不会每次运行'pj_transform()`
const char*wgs84_str=“+init=epsg:4326”;
const char*merc_str=“+init=epsg:3857”;
const projPJ pj_wgs84=pj_init_plus(wgs84_str);
const projPJ pj_merc=pj_init_plus(merc_str);
//使用全局投影来做一些有计划的事情
空向量计算器(标准::向量和x,标准::向量和y){
pj_变换(pj_wgs84,pj_merc,x.size(),1,x.data(),y.data(),NULL);
}
int main(int argc,字符**argv){
std::矢量dvs(1000);
对于(int i=0;i以下工程:

#包括
#包括
#包括
#包括
#包括
typedef-std::向量dvec;
typedef std::pair-dvpair;
//在这里定义它们,这样我们就不会每次运行'pj_transform()`
const char*wgs84_str=“+init=epsg:4326”;
const char*merc_str=“+init=epsg:3857”;
//使用静态意味着这些变量是文件范围
//静态的,那么变量可以跨多个文件访问,OpenMP将
//不是那样的
静态项目pj_wgs84;
静态项目;
静态projCtx pj_ctx;
//设置它,使每个线程都有自己的私有副本
#pragma omp threadprivate(pj_wgs84)
#pragma omp threadprivate(pj_merc)
#pragma omp threadprivate(pj_ctx)
//使用全局投影来做一些有计划的事情
空向量计算器(标准::向量和x,标准::向量和y){
pj_变换(pj_wgs84,pj_merc,x.size(),1,x.data(),y.data(),NULL);
}
int main(int argc,字符**argv){
std::矢量dvs(10000);

有关(int i=0;i您正在查找的
threadprivate
,请参见
#include <proj_api.h>
#include <cstdlib>
#include <vector>
#include <utility>
#include <cmath>

typedef std::vector<double>  dvec;
typedef std::pair<dvec,dvec> dvpair;

//Define these here so we're not making them every time we run `pj_transform()`
const char* wgs84_str = "+init=epsg:4326";
const char* merc_str  = "+init=epsg:3857";
projPJ  pj_wgs84;
projPJ  pj_merc;
projCtx pj_ctx;

//Use the global projections to do projecty stuff
void ToMercator(std::vector<double> &x, std::vector<double> &y){
  pj_transform(pj_wgs84, pj_merc, x.size(), 1, x.data(), y.data(), NULL);
}

int main(int argc, char **argv){
  std::vector<dvpair> dvs(1000);
  for(int i=0;i<dvs.size();i++){
    dvs[i].first.push_back(2*M_PI*rand()-M_PI);  //Longitude in [-180,180]
    dvs[i].second.push_back(M_PI*rand()-M_PI/2); //Latitude in [-90,90]
  }

  #pragma omp parallel private(pj_ctx, pj_wgs84, pj_merc)
  {
    pj_ctx   = pj_ctx_alloc();
    pj_wgs84 = pj_init_plus_ctx(pj_ctx,wgs84_str);
    pj_merc  = pj_init_plus_ctx(pj_ctx,merc_str);

    #pragma omp for
    for(int i=0;i<dvs.size();i++)
      ToMercator(dvs[i].first,dvs[i].second);
  }
}
projPJ  pj_wgs84;
projPJ  pj_merc;
projCtx pj_ctx;
#pragma omp threadprivate(pj_wgs84)
#pragma omp threadprivate(pj_merc)
#pragma omp threadprivate(pj_ctx)

...

#pragma omp parallel private(pj_ctx, pj_wgs84, pj_merc)
{
  pj_ctx   = pj_ctx_alloc();

...
/usr/bin/ld: pj_merc: TLS definition in /tmp/ccqZRl8N.o section .tbss mismatches non-TLS definition in /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/libproj.so section .text
/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/libproj.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status