我一直试图通过计算一个使用以下代码对数组元素进行扩展和求和的例程来了解在L1缓存与内存中使用数组的影响(我知道我应该将结果缩放为' a'在最后;关键是在循环中同时进行乘法和加法 - 到目前为止,编译器还没有想出要将'a'分解出来):
double sum(double a,double* X,int size)
{
double total = 0.0;
for(int i = 0; i < size; ++i)
{
total += a*X[i];
}
return total;
}
#define KB 1024
int main()
{
//Approximately half the L1 cache size of my machine
int operand_size = (32*KB)/(sizeof(double)*2);
printf("Operand size: %d\n", operand_size);
double* X = new double[operand_size];
fill(X,operand_size);
double seconds = timer();
double result;
int n_iterations = 100000;
for(int i = 0; i < n_iterations; ++i)
{
result = …Run Code Online (Sandbox Code Playgroud) 我正在创建一个树(本质上是一个前缀树,但对于数字而不是字符串),它是从数字元组的排序列表((1,1,2),(1,2,5),(2,1, 0)等...),每一个都与一个标量值相关联(最可能是int或double).由于它只构建一次然后多次迭代/搜索,我计划使用std :: vectors来保存每个节点的子节点.要搜索树,我只需要调用std :: lower_bound对每个节点的_children向量进行二进制搜索,该向量将包含每个节点的std ::对及其各自的键.但是,底部节点必须包含一个向量,该向量的对由每个元组中的最后一个条目及其各自的值组成,因此必须与BranchNode的类型不同.代码如下所示:
class GenNode
{
};
template<typename key_type,typename value_type>
class BranchNode : GenNode
{
void insert(std::pair< std::vector<key_type> , value_type>);
private:
std::vector< std::pair<key_type,GenNode*> > _children;
};
template<typename key_type,typename value_type>
class LeafNode : GenNode
{
private:
std::vector< std::pair<key_type,value_type> > _children;
};
Run Code Online (Sandbox Code Playgroud)
但是,这真的很难看,因为这两个类必须从无用的GenNode类继承,以便每个BranchNode的子节点可以是其他BranchNodes或LeafNodes ...有更好的方法吗?
注意:问题末尾给出了详尽的系统详细信息。
我试图让我的开发机器具有非常稳定的 CPU 频率,以便我可以获得一些线性代数代码的精确基准 - 然而,它仍然显示出明显的频率波动。
我已将缩放调节器设置为performance模式:
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
Run Code Online (Sandbox Code Playgroud)
我还锁定了C0状态中的所有内容:
sudo cpupower idle-set -D 0
Run Code Online (Sandbox Code Playgroud)
然而,使用 时i7z,我仍然观察到 CPU 频率波动 >5%。我非常感谢有关我是否应该采取进一步步骤将 CPU 频率限制为固定值,或者是否无法获得更精确的频率限制的指导。
附录:
我的处理器是 Intel Core i7-9750H:
cat /proc/cpuinfo | grep 'model name'
model name : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
...
Run Code Online (Sandbox Code Playgroud)
它有 12 个逻辑 CPU 和 6 个物理核心:
lscpu -a -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
0 0 0 0 0:0:0:0 yes 4500.0000 800.0000
1 …Run Code Online (Sandbox Code Playgroud) 我使用以下代码来测试运行时 daxpy 例程初始化后刷新缓存的效果(带有 fill() 和 wall_time() 例程的完整代码位于:http: //codepad.org/QuLT3cbD - 它是 150 行):
#define KB 1024
int main()
{
int cache_size = 32*KB;
double alpha = 42.5;
int operand_size = cache_size/(sizeof(double)*2);
double* X = new double[operand_size];
double* Y = new double[operand_size];
//95% confidence interval
double max_risk = 0.05;
//Interval half width
double w;
int n_iterations = 100;
students_t dist(n_iterations-1);
double T = boost::math::quantile(complement(dist,max_risk/2));
accumulator_set<double, stats<tag::mean,tag::variance> > unflushed_acc;
for(int i = 0; i < n_iterations; ++i)
{
fill(X,operand_size);
fill(Y,operand_size);
double seconds = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将现有的git存储库导入为eclipse项目.存储库存储在〜/ src/repo_dir位置,〜/ src /是我的eclipse工作空间目录.
如果我使用菜单操作序列:
File --> Import --> Git --> Projects from Git --> Local --> (Select my repo)
--> "Import as General Project"
Run Code Online (Sandbox Code Playgroud)
我收到错误:
/Users/me/src/repo_dir overlaps the location of another project: 'repo_dir'
Run Code Online (Sandbox Code Playgroud)
我无法导入该项目.这似乎是因为Egit不希望导入的原始仓库已经在工作区中.但是,如果我然后将repo_dir移出工作空间目录〜/ src /,然后通过上面的方法导入项目,它就不会将内容复制到工作空间目录,所以现在我的文件存在于其他地方,这是不可取的.我找到的唯一解决方法是将repo移出〜/ src,导入它,删除生成的项目,将repo移回〜/ src,然后用git作为'Existing project'导入它.有谁知道更清洁的方法来处理这个?
c++ ×3
c ×2
optimization ×2
performance ×2
assembly ×1
benchmarking ×1
cpu ×1
eclipse ×1
egit ×1
git ×1
linux ×1
polymorphism ×1