gpt4 book ai didi

python - 为什么 numpy 比我的 c/c++ 代码对 float 组求和更快?

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:09 24 4
gpt4 key购买 nike

我正在测试我的简单共享 C 库的效率,并将其与 numpy 实现进行比较。

库创建:在sum_function.c中定义了以下函数:

float sum_vector(float* data, int num_row){
float value = 0.0;
for (int i = 0; i < num_row; i++){
value += data[i];
}
return value;
}

库编译:共享库sum.so由

创建
clang -c sum_function.c
clang -shared -o sum.so sum_function.o

测量:创建一个简单的 numpy 数组,并使用上述函数计算其元素的总和。

from ctypes import *
import numpy as np

N = int(1e7)
data = np.arange(N, dtype=np.float32)

libc = cdll.LoadLibrary("sum.so")
libc.sum_vector.restype = c_float
libc.sum_vector(data.ctypes.data_as(POINTER(c_float)),
c_int(N))

上述函数耗时 30 毫秒。但是,如果我使用 numpy.sum,执行时间仅为 4 毫秒。

所以我的问题是:是什么让 numpy 比我的 C 实现快很多?我想不出在计算 vector 和的算法方面有什么改进。

最佳答案

有很多原因可能涉及,甚至取决于您使用的编译器。在许多情况下,您的 numpy 后端是 C/C++。换句话说,您必须认识到像 C++ 这样的语言可以提高效率并与硬件接触,但也需要大量知识。 C++ 少于 C,只要您像@PaulMcKenzie 的评论中那样使用 STL。这些是针对运行时性能优化的例程。

接下来是内存分配。现在,您的 vector 似乎足够大,可以让 <std::vector> 中的分配器将对齐堆上的内存。堆栈上的内存最终可能会保持未对齐状态 std::accumulate甚至要慢。这是如何编写这样的分配器以避免这种情况的想法:https://github.com/kvahed/codeare/blob/master/src/matrix/Allocator.hpp .这是我作为博士生编写的 MRI 图像重建库的一部分。

关于 SIMD 的一句话:相同的库的其他方面。 https://github.com/kvahed/codeare/blob/master/src/matrix/SIMDTraits.hpp如何进行最先进的算术运算绝非易事。

以上两个概念最终形成https://github.com/kvahed/codeare/blob/master/src/matrix/Matrix.hpp ,您可以轻松地在特定机器上胜过任何标准化代码。

最后但同样重要的是:编译器和编译器标志。您的运行时代码应该在调试后可能会被编译 -O2 -g甚至 -O3 .如果你有很好的测试覆盖率,你甚至可以逃脱 -Ofast这会降低 IEEE 的数学精度。除了数值积分,我从未见过任何问题。

关于python - 为什么 numpy 比我的 c/c++ 代码对 float 组求和更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51033429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com