C++ 是否可以用openMP初始化一个复杂度为O(1)的向量?(C+;+;)

C++ 是否可以用openMP初始化一个复杂度为O(1)的向量?(C+;+;),c++,vector,struct,openmp,C++,Vector,Struct,Openmp,我正在尝试使用openMP并行化结构中的一些向量函数。虽然它在我的大多数实现中都能很好地工作,但我发现由于std::vector的构造函数具有线性复杂性,因此我无法获得更好的性能,反而得到了比按顺序进行初始化更糟糕的结果 这是一个初始值设定项 /** * @brief Construct a new constant parallel Vector object with a given value constantEntry *

我正在尝试使用openMP并行化结构中的一些向量函数。虽然它在我的大多数实现中都能很好地工作,但我发现由于
std::vector
的构造函数具有线性复杂性,因此我无法获得更好的性能,反而得到了比按顺序进行初始化更糟糕的结果

这是一个初始值设定项

         /**
         * @brief Construct a new constant parallel Vector object with a given value constantEntry
         * 
         * @param dim 
         * @param constantEntry 
         */
        parallelVector(const int dim, const double constantEntry){
            dimension = dim;
            values = std::vector<double>(dimension);

            #pragma omp parallel for schedule(static)
            for (int i=0 ; i<dimension; i++){
                values[i] = constantEntry;
            }
        }
/**
*@brief构造一个新的具有给定值constantEntry的常量平行向量对象
* 
*@param-dim
*@param constantEntry
*/
平行向量(常数整型,常数双常数){
尺寸=尺寸;
值=标准::向量(维度);
#计划的pragma omp并行(静态)
对于(int i=0;i
模板
未初始化的结构\u分配器:std::allocator{
模板
无效构造(T*p、美国和…美国){
::新((空*)p)T(标准::远期(美国)…);
}
//传递0个参数时不构造
空洞构造(T*p){};
};
随后:

    int dimension = 0;
    std::vector<double, uninitialized_allocator<double>> values;
    parallelVector(const int dim, const double constantEntry):
      dimension(dim),
      values(dim)
    {
        #pragma omp parallel for schedule(static)
        for (int i=0 ; i<dimension; i++){
            values[i] = constantEntry;
        }
    }
int维=0;
std::向量值;
平行向量(常数整型,常数双常数):
尺寸(dim),
数值(dim)
{
#计划的pragma omp并行(静态)

对于(inti=0;ii)如果向量中有N个元素,你应该如何在不到O(N)的时间内将它们放入向量中?你的意思是在M个线程中进行?这就需要O(N/M)时间,这仍然是O(N)。您只想创建向量内存缓冲区而不初始化它吗?理想情况下,我希望创建缓冲区,并且只需要在for循环中初始化它。这就是您所说的O(N/M)。我在文档页上读到,可以使用分配器使用O(1)创建内存缓冲区,这就是我的意思。可能措词不当。FWIW,
values=std::vector(dimension,constantEntry);
摆脱了循环,对于一个好的向量实现,它应该得到某种低级别的并行化,比如SIMD。它也应该被移到“不确定”中,但我猜
values=std::vector(dimension);
比整个循环更昂贵,我不希望使用多个线程会有任何加速。请注意,您把事情弄混了。您谈论的是构造函数和分配,但您的代码是关于并行分配给已构造向量的元素。您是否分别测量了这两部分?是的,现在因为行
values=std::vector(dimension);
已经是O(N),所以我无法在循环中加速它。我使用
values=std::vector(dimension,constantEntry);
作为我的“顺序向量”结构,但我只是想知道是否有一种方法,我可以在不初始化的情况下创建内存缓冲区,然后像代码中的for循环那样使用赋值。谢谢。我想这就是我所希望的。但是我注意到我并没有得到我所期望的加速-你认为这是因为
结构(t*)吗
调用?@MichaelB您正在使用什么优化设置?您是如何评测的?请注意,std vector仍然从中央堆获取内存,这可能会很昂贵,在某些平台上,在您无论如何访问它之前,归零内存不会归零。我运行/O1,不使用评测器,只是使用
std::chrono
进行简单的度量。
    int dimension = 0;
    std::vector<double, uninitialized_allocator<double>> values;
    parallelVector(const int dim, const double constantEntry):
      dimension(dim),
      values(dim)
    {
        #pragma omp parallel for schedule(static)
        for (int i=0 ; i<dimension; i++){
            values[i] = constantEntry;
        }
    }