小编Sam*_*zer的帖子

C++:将一个操作数保存在寄存器中的神秘速度非常快

我一直试图通过计算一个使用以下代码对数组元素进行扩展和求和的例程来了解在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)

c c++ optimization performance assembly

69
推荐指数
3
解决办法
3938
查看次数

C++:分支和叶子节点的单独类?

我正在创建一个树(本质上是一个前缀树,但对于数字而不是字符串),它是从数字元组的排序列表((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 ...有更好的方法吗?

c++ polymorphism data-structures

5
推荐指数
1
解决办法
954
查看次数

用于基准测试的 CPU 频率应该有多稳定?

注意:问题末尾给出了详尽的系统详细信息。

我试图让我的开发机器具有非常稳定的 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)

linux cpu benchmarking microbenchmark

5
推荐指数
1
解决办法
589
查看次数

缓存刷新后计时的不确定性非常高

我使用以下代码来测试运行时 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)

c c++ optimization performance

3
推荐指数
1
解决办法
266
查看次数

Eclipse Egit不会在工作区中导入repo

我正在尝试将现有的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'导入它.有谁知道更清洁的方法来处理这个?

eclipse git egit

2
推荐指数
1
解决办法
1383
查看次数