gpt4 book ai didi

c++ - vector 比 double* : why? 快

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:34 27 4
gpt4 key购买 nike

这是我用 std::vector<double> 试过的一个循环和普通的旧double* .

对于 1000 万个元素, vector 版本的运行时间是 double* 的大约 80%。版本需要;对于 N 的几乎任何值, vector 明显更快。

查看 GCC STL 源代码,我没有看到 std::vector正在做任何比 double* 本质上更有趣的事情习语正在做(即,使用普通旧 new[] 分配, operator[] 取消引用偏移量)。 This question也是这么说的。

知道为什么 vector 版本更快吗?

Compiler: GCC 4.6.1
Example compile line: g++ -Ofast -march=native -DNDEBUG \
-ftree-vectorizer-verbose=2 -o vector.bin \
vector.cpp -lrt
OS: CentOS 5
CPU: Opteron 8431
RAM: 128 GB

如果我使用 icpc 11.1 或在 Xeon 上运行,结果在质量上是相同的。此外,向量化器转储表示只有 std::vector 中的填充操作。的构造函数被矢量化。

vector 版:

#include <vector>
#include <iostream>
#include <boost/lexical_cast.hpp>
#include "util.h"
#include "rkck_params.h"

using namespace std;

int main( int argc, char* argv[] )
{
const size_t N = boost::lexical_cast<size_t>( argv[ 1 ] );

vector<double> y_old( N );
vector<double> y_new( N );
vector<double> y_err( N );
vector<double> k0( N );
vector<double> k1( N );
vector<double> k2( N );
vector<double> k3( N );
vector<double> k4( N );
vector<double> k5( N );

const double h = 0.5;

const timespec start = clock_tick();
for ( size_t i = 0 ; i < N ; ++i )
{
y_new[ i ] = y_old[ i ]
+ h
*(
rkck::c[ 0 ]*k0[ i ]
+ rkck::c[ 2 ]*k2[ i ]
+ rkck::c[ 3 ]*k3[ i ]
+ rkck::c[ 5 ]*k5[ i ]
);
y_err[ i ] = h
*(
rkck::cdiff[ 0 ]*k0[ i ]
+ rkck::cdiff[ 2 ]*k2[ i ]
+ rkck::cdiff[ 3 ]*k3[ i ]
+ rkck::cdiff[ 4 ]*k4[ i ]
+ rkck::cdiff[ 5 ]*k5[ i ]
);
}
const timespec stop = clock_tick();
const double total_time = seconds( start, stop );

// Output
cout << "vector\t" << N << "\t" << total_time << endl;

return 0;
}

double*版本:

#include <iostream>
#include <boost/lexical_cast.hpp>
#include "util.h"
#include "rkck_params.h"

using namespace std;

int main( int argc, char* argv[] )
{
const size_t N = boost::lexical_cast<size_t>( argv[ 1 ] );

double* y_old = new double[ N ];
double* y_new = new double[ N ];
double* y_err = new double[ N ];
double* k0 = new double[ N ];
double* k1 = new double[ N ];
double* k2 = new double[ N ];
double* k3 = new double[ N ];
double* k4 = new double[ N ];
double* k5 = new double[ N ];

const double h = 0.5;

const timespec start = clock_tick();
for ( size_t i = 0 ; i < N ; ++i )
{
y_new[ i ]
= y_old[ i ]
+ h
*(
rkck::c[ 0 ]*k0[ i ]
+ rkck::c[ 2 ]*k2[ i ]
+ rkck::c[ 3 ]*k3[ i ]
+ rkck::c[ 5 ]*k5[ i ]
);
y_err[ i ]
= h
*(
rkck::cdiff[ 0 ]*k0[ i ]
+ rkck::cdiff[ 2 ]*k2[ i ]
+ rkck::cdiff[ 3 ]*k3[ i ]
+ rkck::cdiff[ 4 ]*k4[ i ]
+ rkck::cdiff[ 5 ]*k5[ i ]
);
}
const timespec stop = clock_tick();
const double total_time = seconds( start, stop );

delete [] y_old;
delete [] y_new;
delete [] y_err;
delete [] k0;
delete [] k1;
delete [] k2;
delete [] k3;
delete [] k4;
delete [] k5;

// Output
cout << "plain\t" << N << "\t" << total_time << endl;

return 0;
}

rkck_params.h :

#ifndef RKCK_PARAMS_H
#define RKCK_PARAMS_H

namespace rkck
{

// C.f. $c_i$ in Ch. 16.2 of NR in C++, 2nd ed.
const double c[ 6 ]
= { 37.0/378.0,
0.0,
250.0/621.0,
125.0/594,
0.0,
512.0/1771.0 };

// C.f. $( c_i - c_i^* )$ in Ch. 16.2 of NR in C++, 2nd ed.
const double cdiff[ 6 ]
= { c[ 0 ] - 2825.0/27648.0,
c[ 1 ] - 0.0,
c[ 2 ] - 18575.0/48384.0,
c[ 3 ] - 13525.0/55296.0,
c[ 4 ] - 277.0/14336.0,
c[ 5 ] - 1.0/4.0 };

}

#endif

util.h :

#ifndef UTIL_H
#define UTIL_H

#include <time.h>
#include <utility>

inline timespec clock_tick()
{
timespec tick;
clock_gettime( CLOCK_REALTIME, &tick );
return tick;
}

// \cite{www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime}
inline double seconds( const timespec& earlier, const timespec& later )
{
double seconds_diff = -1.0;
double nano_diff = -1.0;

if ( later.tv_nsec < earlier.tv_nsec )
{
seconds_diff = later.tv_sec - earlier.tv_sec - 1;
nano_diff = ( 1.0e9 + later.tv_nsec - earlier.tv_nsec )*1.0e-9;
}
else
{
seconds_diff = later.tv_sec - earlier.tv_sec;
nano_diff = ( later.tv_nsec - earlier.tv_nsec )*1.0e-9;
}

return seconds_diff + nano_diff;
}

#endif

最佳答案

在 vector 版本中,您的数据被初始化为零。在 new 版本中它是未初始化的,因此可能会完成不同的工作。

您是否以不同的顺序多次运行?

关于c++ - vector<double> 比 double* : why? 快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6698831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com