小编Rob*_*bon的帖子

线性索引上三角矩阵

如果我有一个矩阵的上三角形部分,在对角线上方偏移,存储为线性数组,那么如何(i,j)从数组的线性索引中提取矩阵元素的索引?

例如,线性阵列[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9是矩阵的存储

0  a0  a1  a2  a3
0   0  a4  a5  a6
0   0   0  a7  a8
0   0   0   0  a9
0   0   0   0   0
Run Code Online (Sandbox Code Playgroud)

并且我们想要知道数组中的(i,j)索引,该索引对应于线性矩阵中的偏移,而没有递归.

例如,合适的结果k2ij(int k, int n) -> (int, int)将满足

k2ij(k=0, n=5) = (0, 1)
k2ij(k=1, n=5) = (0, 2)
k2ij(k=2, n=5) = (0, 3)
k2ij(k=3, n=5) = (0, 4)
k2ij(k=4, n=5) = (1, 2)
k2ij(k=5, n=5) = (1, 3) …
Run Code Online (Sandbox Code Playgroud)

c++ arrays numpy linear-algebra triangular

32
推荐指数
3
解决办法
9083
查看次数

SSE未对齐的负载内在是否比x64_64 Intel CPU上固有的对齐负载慢?

我正在考虑更改一些目前需要16字节对齐数组的代码高性能代码,并用于_mm_load_ps放宽对齐约束和使用_mm_loadu_ps.关于SSE指令的内存对齐的性能影响有很多神话,所以我做了一个小的测试用例,它应该是一个内存带宽限制的循环.使用对齐或未对齐的加载内在函数,它通过大型数组运行100次迭代,使用SSE内在函数对元素求和.源代码在这里.https://gist.github.com/rmcgibbo/7689820

带有Sandy Bridge Core i5的64位Macbook Pro的结果如下.数字越小表示性能越快.当我阅读结果时,我发现在未对齐的内存上使用_mm_loadu_ps基本上没有性能损失.

我觉得这很令人惊讶.这是一个公平的测试/合理的结论吗?在哪些硬件平台上有区别?

$ gcc -O3 -msse aligned_vs_unaligned_load.c  && ./a.out  200000000
Array Size: 762.939 MB
Trial 1
_mm_load_ps with aligned memory:    0.175311
_mm_loadu_ps with aligned memory:   0.169709
_mm_loadu_ps with unaligned memory: 0.169904
Trial 2
_mm_load_ps with aligned memory:    0.169025
_mm_loadu_ps with aligned memory:   0.191656
_mm_loadu_ps with unaligned memory: 0.177688
Trial 3
_mm_load_ps with aligned memory:    0.182507
_mm_loadu_ps with aligned memory:   0.175914
_mm_loadu_ps with unaligned memory: 0.173419
Trial 4
_mm_load_ps with aligned …
Run Code Online (Sandbox Code Playgroud)

c python performance sse

18
推荐指数
4
解决办法
6491
查看次数

在python中使用ASCII颜色打印漂亮的JSON

我正在寻找使用ASCII颜色在命令行中打印JSON,在python中.例如,(优秀)jq实用程序将使用粗体ASCII颜色着色JSON,如下所示:

  • 输入: curl --silent http://coinabul.com/api.php | jq .
  • 输出:
    jq输出

有谁知道如何从Python实现这种效果?一些SO问题提供了一些关于使用python中的ASCII颜色的好信息(例如,使用Python在终端中打印颜色?),但这种效果需要以不同的方式将漂亮的印刷机械与着色机械相结合,我认为.

python json pretty-print

11
推荐指数
2
解决办法
5503
查看次数

Matrix/Tensor Triple产品?

我正在研究的算法需要在几个地方计算一种矩阵三元产品.

该操作采用具有相同尺寸的三个方形矩阵,并产生3指数张量.标记操作数A,B以及结果C(i,j,k)第th个元素

X[i,j,k] = \sum_a A[i,a] B[a,j] C[k,a]
Run Code Online (Sandbox Code Playgroud)

在numpy中,你可以用它来计算einsum('ia,aj,ka->ijk', A, B, C).

问题:

  • 此操作是否具有标准名称?
  • 我可以通过一次BLAS呼叫来计算吗?
  • 是否有任何其他重度优化的数值C/Fortran库可以计算这种类型的表达式?

matlab numpy matrix blas matrix-multiplication

9
推荐指数
2
解决办法
866
查看次数

检查集合的集合是否成对不相交

确定集合集合是否成对不相交的最有效方法是什么? - 即验证所有对集合之间的交集是否为空.这样做有多高效?

sorting algorithm set

6
推荐指数
2
解决办法
1977
查看次数

哪种内存访问模式对外部产品类型的双循环最有效?

哪种访问模式对于编写最大限度利用数据数据位置的缓存高效的外部产品类型代码最有效?

考虑用于处理两个数组的所有元素对的代码块,例如:

for (int i = 0; i < N; i++)
    for (int j = 0; j < M; j++)
        out[i*M + j] = X[i] binary-op Y[j];
Run Code Online (Sandbox Code Playgroud)

这是binary-op标量乘法时的标准矢量矢量外积,X并且Y是1d,但是这个相同的模式也是矩阵乘法,当XY是矩阵时,它binary-op是两个矩阵的第一i行和j第二列之间的点积.

对于矩阵乘法,我知道了优化布拉斯像OpenBLAS和MKL可以得到很多比你从上面的双循环式的代码获得更高的性能,因为它们处理成块的元素以这样的方式来利用CPU缓存等等.不幸的是,OpenBLAS内核是用汇编语言编写的,因此很难弄清楚发生了什么.

是否有任何好的"交易技巧"重新组织这些类型的双循环以提高缓存性能?

由于每个元素out只被击中一次,我们显然可以自由地重新排序迭代.直线遍历out是最容易编写的,但我不认为这是最有效的执行模式,因为你没有利用任何地方X.

我特别感兴趣的是设置where MNlarge,并且每个元素(X[i],和Y[j])的大小非常小(比如O(1)字节),因此讨论类似于vector-vector外积或乘法的东西由短而脂肪的基质组成的高而瘦的基质(例如N x D,D x M在哪里D很小).

c memory performance blas

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

检索CMake中的所有链接标志

在CMake中,是否可以以编程方式检索将用于给定目标的链接器标志的完整列表?我看到的唯一方法是检查link.txt目标CMakeFiles目录中的文件。不理想。

我感兴趣的用例是收集数据,以将其包含在pkg-config文件之类的文件中。我正在编写一个库,它包括几个使用该库的可执行实用程序。构建可执行文件(尤其是在静态构建库时)需要一条非平凡的链接行来链接到我的库及其依赖项。因此,我想写出将这些可执行文件构建到包中包含的数据文件中所需的链接行,以便其他客户端可以知道如何链接。

cmake

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

跨平台托管持续集成

是否存在任何现有的跨平台托管持续集成Linux + OSX + Windows版本的平台?

我正在寻找的工作流程是:

  1. 我承诺GitHub,或合并PR.
  2. 使用一配置脚本,项目可在Linux,Windows和OSX计算机上进行编译和测试.
  3. 如果一切顺利,工件将上传到S3或其他东西,ping将被激活回github状态API.
  4. 整个事情都在云中运行,所以我不必管理基础设施.
  5. 定价结构要么免费开源(不能打败),要么价格合理,可以用于中小型开源项目.
  6. 该平台不限于Web应用程序或脚本语言.在某些时候,我们需要编译一些C/C++.

各种平台处理linux的这一方面:TravisCI,CircleCI,CodeShip等.我知道AppveyorCI是为Windows做的.

是否所有提供商都为所有三个平台托管了CI?

linux windows macos build-automation continuous-integration

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