小编stu*_*ent的帖子

为什么我的 Intel Skylake / Kaby Lake CPU 在简单的哈希表实现中会出现神秘的 3 倍速度下降?

简而言之:

我已经实现了一个简单的(多键)哈希表,其中包含完全适合缓存行的存储桶(包含多个元素)。插入缓存行存储桶非常简单,也是主循环的关键部分。

我已经实现了三个版本,它们产生相同的结果并且行为应该相同。

谜

然而,尽管所有版本都具有完全相同的缓存行访问模式并产生相同的哈希表数据,但我发现性能差异惊人地大到了 3 倍。

与我的 CPU (i7-7700HQ)相比,最佳实现insert_ok速度慢了大约 3 倍。一个变体 insert_bad 是一种简单的修改,它在缓存行中添加了额外的不必要的线性搜索,以找到要写入的位置(它已经知道),并且不会遭受 3 倍的减速。insert_badinsert_altinsert_ok

与其他 CPU(AMD 5950X (Zen 3)、Intel i7-11800H (Tiger Lake))相比,完全相同的可执行文件显示insert_ok速度快 1.6 倍。insert_badinsert_alt

# see https://github.com/cr-marcstevens/hashtable_mystery
$ ./test.sh
model name      : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
==============================
CXX=g++    CXXFLAGS=-std=c++11 -O2 -march=native -falign-functions=64
tablesize: 117440512 elements: 67108864 loadfactor=0.571429
- test insert_ok : 11200ms
- test insert_bad: 3164ms
  (outcome identical to insert_ok: true)
- test insert_alt: 3366ms
  (outcome identical …
Run Code Online (Sandbox Code Playgroud)

c++ performance gcc hashtable x86-64

79
推荐指数
1
解决办法
6022
查看次数

pmin给出了错误的答案

pmin 在以下示例中不返回适当的输出.

eps <- 1e-16
x <- structure(list(X = c(0.219801587301587, 0.340792857142857, 0.398129365079365, 
                      1, 1, 0.853353968253968, 0.930726984126984, 0.980263131313131, 
                      0.968269047619047, 0.953053336369513, 1, 1, 1, 0.951969003219003, 
                      0.91514335177894, 0.884824997224998, 0.884824997224998, 0.884824997224998 )), row.names = c(NA, 18L), class = "data.frame", .Names = "X")

pmin(x, 1 - eps)
Run Code Online (Sandbox Code Playgroud)

该函数错误地返回NA值为1的x位置.是否应将此报告为错误?

r dataframe

6
推荐指数
1
解决办法
115
查看次数

等效于conda的apt-get install python3.6-dev

如何使用python的开发版本创建conda环境?还是我创建一个扩展时已经包含所有必需的扩展。

conda create -n py36 python=3.6

python conda

6
推荐指数
1
解决办法
5176
查看次数

标签 统计

c++ ×1

conda ×1

dataframe ×1

gcc ×1

hashtable ×1

performance ×1

python ×1

r ×1

x86-64 ×1