小编Inf*_*y77的帖子

在二维数组中查找非零索引和值的更好方法

我仍在与在密集单精度Fortran 排序的二维数组中查找非零条目的索引(和相应值)i的问题作斗争。我通过 Python 使用 Cython,中间有一些 C。j

我提前道歉,因为这篇文章将会非常长。

介绍

我必须处理数千个(有时数百万个)中型 2D 数组(有时 700 x 1,000,有时 6,000 x 7,000 等等),这些数组非常稀疏,但它们提供为密集的(密度可以低至 0.02% 和高达 1-2%)。这些矩阵有时具有某种结构,但通常这是不可预测的。

我尝试过 numpy.nonzero 和 Scipy稀疏的东西,但不幸的是它们比我的慢。

我问这个问题是为了看看我的(可能不正确的)代码的性能是否有可能改进- 即,使其更快 - 而且也可以从更有经验的人那里学习新东西。

我对 Cython 的熟练程度非常有限。我对 C 的了解很糟糕(实际上几乎为零)。我所知道的关于 SIMD 指令的一切都可以用大字写在邮票上。

我在 StackOverflow 上来回搜索并找到了类似问题的答案,其中许多问题都使用了非常先进的 SIMD 解决方案。但由于我对 SIMD 一无所知,因此我无法修改它们以满足我的需要。

配置

  • Windows 10 64 位(Skylake AVX512,但我还应该瞄准 Icelake-client 和 Alderlake,可能还有其他一些)
  • Python 3.9.11 64 位
  • 赛通 0.29.32,NumPy 1.21.5
  • GCC 11.2.0(如果需要,我可以转到 GCC 12)

我使用这些标志编译下面发布的 Cython 脚本:

-O3 -ffast-math -funroll-loops -ftree-vectorize …
Run Code Online (Sandbox Code Playgroud)

c python gcc simd cython

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

标签 统计

c ×1

cython ×1

gcc ×1

python ×1

simd ×1