相关疑难解决方法(0)

使用SSE进行高效的4x4矩阵向量乘法:水平加点和点积 - 重点是什么?

我试图使用SSE找到使用向量(u)的4x4矩阵(M)乘法的最有效实现.我的意思是Mu = v.

据我所知,有两种主要方法可以解决这个问题:

    method 1) v1 = dot(row1, u), v2 = dot(row2, u), v3 = dot(row3, u), v4 = dot(row4, u)
    method 2) v = u1 col1 + u2 col2 + u3 col3 + u4 col4.
Run Code Online (Sandbox Code Playgroud)

方法2易于在SSE2中实现.方法1可以用SSE3中的水平加法指令或SSE4中的点积指令来实现.但是,在我的所有测试中,方法2总是优于方法1.

我认为方法1有优势的一个地方是3x4矩阵,例如仿射变换.在这种情况下,最后一个点积是不必要的.但即使在这种情况下,4x4矩阵上的方法2也比3x4矩阵上的方法1快.我发现的唯一方法比4x4矩阵上的方法2快4x3矩阵上的方法2.

那么水平加法和点积指令有什么意义呢?事实上,点生产指令在这种情况下表现最差.也许它与数据格式有关?如果无法定义矩阵的排序方式,那么转置是必要的,在这种情况下,方法1可能会更好吗?

请参阅下面的一些代码.

__m128 m4x4v_colSSE(const __m128 cols[4], const __m128 v) {
  __m128 u1 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(0,0,0,0));
  __m128 u2 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(1,1,1,1));
  __m128 u3 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(2,2,2,2));
  __m128 u4 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(3,3,3,3));

  __m128 prod1 = _mm_mul_ps(u1, cols[0]);
  __m128 prod2 = _mm_mul_ps(u2, cols[1]);
  __m128 …
Run Code Online (Sandbox Code Playgroud)

c optimization performance sse matrix-multiplication

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

高效的4x4矩阵乘法(C vs汇编)

我正在寻找一种更快,更棘手的方法来将C中的两个4x4矩阵相乘.我目前的研究主要集中在具有SIMD扩展的x86-64汇编上.到目前为止,我已经创建了一个函数,比一个简单的C实现快6倍,这超出了我对性能改进的期望.不幸的是,只有在没有使用优化标志进行编译时(GCC 4.7),这种情况才会成立.随着-O2,C变得更快,我的努力变得毫无意义.

我知道现代编译器利用复杂的优化技术来实现几乎完美的代码,通常比巧妙的手工装配更快.但在少数性能关键的情况下,人类可能会尝试使用编译器争取时钟周期.特别是,当一些支持现代ISA的数学可以被探索时(就像我的情况一样).

我的函数如下(AT&T语法,GNU汇编程序):

    .text
    .globl matrixMultiplyASM
    .type matrixMultiplyASM, @function
matrixMultiplyASM:
    movaps   (%rdi), %xmm0    # fetch the first matrix (use four registers)
    movaps 16(%rdi), %xmm1
    movaps 32(%rdi), %xmm2
    movaps 48(%rdi), %xmm3
    xorq %rcx, %rcx           # reset (forward) loop iterator
.ROW:
    movss (%rsi), %xmm4       # Compute four values (one row) in parallel:
    shufps $0x0, %xmm4, %xmm4 # 4x 4FP mul's, 3x 4FP add's 6x mov's per row,
    mulps %xmm0, %xmm4        # expressed in four sequences of 5 instructions,
    movaps …
Run Code Online (Sandbox Code Playgroud)

c optimization assembly sse matrix-multiplication

15
推荐指数
3
解决办法
2万
查看次数