我正在运行google benchmark进行一些基本的缓存测试,我得到了以下错误:
terminate called after throwing an instance of 'std::length_error'
what(): cannot create std::vector larger than max_size()
但是,我打印的是max_size和实际大小(见下文),虽然max_size等于2^60-1,但它在2^28处中断。我遗漏了什么?
基准测试代码如下。代码是使用带有c++20的clang11编译的。
static void bm_std_vector_in_cache_double(benchmark::State& state)
{
auto constexpr d{3.1415};
auto const bytes = (2 << state.range(0)) * 1024;
auto data = std::vector<double>(bytes / sizeof(double), d);
std::cout << data.max_size() << '\n';
std::cout << data.size() << '\n';
for (auto _ : state){
auto sum = 0.0;
for(auto j = 0; j < data.size(); ++j)
benchmark::DoNotOptimize(sum += data[j] * data[j]);
}
state.SetBytesProcessed(state.iterations() * data.size());
}
BENCHMARK(bm_std_vector_in_cache_double)->DenseRange(1, 20);
发布于 2020-11-27 03:57:09
这里的问题是字节的类型是int。
auto const bytes = (2 << state.range(0)) * 1024;
更改为
auto const bytes = (2 << state.range(0)) * 1024L;
将其更改为long,允许使用更长的向量,甚至更好的是unsigned long long:
auto const bytes = (2 << state.range(0)) * 1024ULL;
https://stackoverflow.com/questions/65027806
复制相似问题