相关疑难解决方法(0)

在Java中从int转换为short是多么昂贵

在运行时性能方面,在Java中将int转换为short是多么昂贵?可能有成千上万的这样的铸造,因此我想知道它是否会影响性能.谢谢.

java int casting micro-optimization

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

性能损失:非规范化数字与分支错误预测

对于那些已经测量过或对此类注意事项有深入了解的人,假设您必须执行以下操作(仅选择任何示例)浮点运算符:

float calc(float y, float z)
{ return sqrt(y * y + z * z) / 100; }
Run Code Online (Sandbox Code Playgroud)

哪里y和z可能是非正规数,让我们假设两种可能的情况,其中只有 y,只有 z,或者两者,以完全随机的方式,可以是非正规数

  • 50%的时间
  • <1% 的时间

现在假设我想避免处理非正规数的性能损失,我只想将它们视为 0,然后通过以下方式更改该段代码:

float calc(float y, float z)
{
   bool yzero = y < 1e-37;
   bool zzero = z < 1e-37;
   bool all_zero = yzero and zzero;
   bool some_zero = yzero != zzero;

   if (all_zero)
      return 0f;

   float ret;

   if (!some_zero) ret = sqrt(y * y + z * z);
   else if (yzero) …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point x86 micro-optimization branch-prediction

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

memcpy 击败 SIMD 内在函数

当 NEON 向量指令在 ARM 设备上可用时,我一直在寻找复制各种数据量的快速方法。

\n

我做了一些基准测试,并得到了一些有趣的结果。我试图理解我所看到的东西。

\n

我有四个版本来复制数据:

\n

1. 基线

\n

逐个元素复制:

\n
for (int i = 0; i < size; ++i)\n{\n    copy[i] = orig[i];\n}\n
Run Code Online (Sandbox Code Playgroud)\n

2. 霓虹灯

\n

此代码将四个值加载到临时寄存器中,然后将该寄存器复制到输出。

\n

因此,负载数量减少了一半。可能有一种方法可以跳过临时寄存器并将负载减少四分之一,但我还没有找到方法。

\n
int32x4_t tmp;\nfor (int i = 0; i < size; i += 4)\n{\n    tmp = vld1q_s32(orig + i); // load 4 elements to tmp SIMD register\n    vst1q_s32(&copy2[i], tmp); // copy 4 elements from tmp SIMD register\n}\n
Run Code Online (Sandbox Code Playgroud)\n

3. 阶梯式memcpy,

\n

使用memcpy,但一次复制 4 …

c++ performance arm simd intrinsics

0
推荐指数
1
解决办法
1717
查看次数

numpy 比 Eigen C++ 更快、更高效?

最近,我和一位同事就 python 和 C++ 的性能比较进行了争论。我们俩主要使用这些语言来进行线性代数。所以我写了两个脚本,一个在 python3 中使用 numpy,另一个在 C++ 中使用 Eigen。

Python3 numpy版本matmul_numpy.py:

import numpy as np
import time
a=np.random.rand(2000,2000)
b=np.random.rand(2000,2000)
start=time.time()
c=a*b
end=time.time()
print(end-start) 
Run Code Online (Sandbox Code Playgroud)

如果我运行这个脚本

python3 matmul_numpy.py
Run Code Online (Sandbox Code Playgroud)

这将返回:

0.07 seconds
Run Code Online (Sandbox Code Playgroud)

C++ 特征版本 matmul_eigen.cpp:


#include <iostream>
#include <Eigen/Dense>
#include "time.h"
int main(){
        clock_t start,end;
        size_t n=2000;
        Eigen::MatrixXd a=Eigen::MatrixXd::Random(n,n);
        Eigen::MatrixXd b=Eigen::MatrixXd::Random(n,n);
        start=clock();
        Eigen::MatrixXd c=a*b;
        end=clock();
        std::cout<<(double)(end-start)/CLOCKS_PER_SEC<<std::endl;
        return 0;}
Run Code Online (Sandbox Code Playgroud)

我编译的方式是

g++ matmul_eigen.cpp -I/usr/include/eigen3 -O3 -march=native -std=c++17 -o matmul_eigen
Run Code Online (Sandbox Code Playgroud)

这将返回(c++11 和 c++17):

0.35 seconds
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪,1-为什么 numpy 这里比 C++ 更快?我是否缺少任何其他优化标志?

我想也许是因为 python 解释器在这里执行程序更快。因此,我使用stacks …

c++ numpy compiler-optimization python-3.x eigen3

0
推荐指数
1
解决办法
2618
查看次数

就地向量修改的理论与实际性能的混淆

为了满足高性能数学库的需求,我一直在对各种方法进行基准测试,以在 Rust vec 上进行就地操作(最好通过引用)。这些方法是:

  • 使用显式 for 循环
  • 使用迭代器,然后使用 a map(),收集到一个新的 vec,并覆盖现有的
  • 使用迭代器然后使用for_each()

这是基准测试代码:

use std::time::{Instant, Duration};

const N_ITEMS: usize = 100000;
const N_BENCH_TIMES: i32 = 100;

fn bench_simple() {
    let mut a: Vec<i32> = vec![5; N_ITEMS];
    for i in a.iter_mut() {
        *i += 1;
    }
}

fn bench_iterator() {
    let mut a: Vec<i32> = vec![5; N_ITEMS];
    let a: Vec<i32> = a.iter_mut().map(|x| *x + 1).collect();
}

fn bench_foreach() {
    let mut a: Vec<i32> = vec![5; N_ITEMS];
    a.iter_mut().for_each(|x| *x += …
Run Code Online (Sandbox Code Playgroud)

benchmarking vector rust

0
推荐指数
1
解决办法
92
查看次数