如果我有一个矩阵的上三角形部分,在对角线上方偏移,存储为线性数组,那么如何(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) 我正在考虑更改一些目前需要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) 我正在寻找使用ASCII颜色在命令行中打印JSON,在python中.例如,(优秀)jq
实用程序将使用粗体ASCII颜色着色JSON,如下所示:
curl --silent http://coinabul.com/api.php | jq .
有谁知道如何从Python实现这种效果?一些SO问题提供了一些关于使用python中的ASCII颜色的好信息(例如,使用Python在终端中打印颜色?),但这种效果需要以不同的方式将漂亮的印刷机械与着色机械相结合,我认为.
我正在研究的算法需要在几个地方计算一种矩阵三元产品.
该操作采用具有相同尺寸的三个方形矩阵,并产生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)
.
问题:
确定集合集合是否成对不相交的最有效方法是什么? - 即验证所有对集合之间的交集是否为空.这样做有多高效?
哪种访问模式对于编写最大限度利用数据数据位置的缓存高效的外部产品类型代码最有效?
考虑用于处理两个数组的所有元素对的代码块,例如:
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,但是这个相同的模式也是矩阵乘法,当X
和Y
是矩阵时,它binary-op
是两个矩阵的第一i
行和j
第二列之间的点积.
对于矩阵乘法,我知道了优化布拉斯像OpenBLAS和MKL可以得到很多比你从上面的双循环式的代码获得更高的性能,因为它们处理成块的元素以这样的方式来利用CPU缓存等等.不幸的是,OpenBLAS内核是用汇编语言编写的,因此很难弄清楚发生了什么.
是否有任何好的"交易技巧"重新组织这些类型的双循环以提高缓存性能?
由于每个元素out
只被击中一次,我们显然可以自由地重新排序迭代.直线遍历out
是最容易编写的,但我不认为这是最有效的执行模式,因为你没有利用任何地方X
.
我特别感兴趣的是设置where M
和N
large,并且每个元素(X[i]
,和Y[j]
)的大小非常小(比如O(1)字节),因此讨论类似于vector-vector外积或乘法的东西由短而脂肪的基质组成的高而瘦的基质(例如N x D
,D x M
在哪里D
很小).
在CMake中,是否可以以编程方式检索将用于给定目标的链接器标志的完整列表?我看到的唯一方法是检查link.txt
目标CMakeFiles
目录中的文件。不理想。
我感兴趣的用例是收集数据,以将其包含在pkg-config文件之类的文件中。我正在编写一个库,它包括几个使用该库的可执行实用程序。构建可执行文件(尤其是在静态构建库时)需要一条非平凡的链接行来链接到我的库及其依赖项。因此,我想写出将这些可执行文件构建到包中包含的数据文件中所需的链接行,以便其他客户端可以知道如何链接。
是否存在任何现有的跨平台托管持续集成Linux + OSX + Windows版本的平台?
我正在寻找的工作流程是:
各种平台处理linux的这一方面:TravisCI,CircleCI,CodeShip等.我知道AppveyorCI是为Windows做的.
是否所有提供商都为所有三个平台托管了CI?