Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用SIMD向量的矩阵乘法+;_C++_Clang_Matrix Multiplication_Simd - Fatal编程技术网

C++ 在C+中使用SIMD向量的矩阵乘法+;

C++ 在C+中使用SIMD向量的矩阵乘法+;,c++,clang,matrix-multiplication,simd,C++,Clang,Matrix Multiplication,Simd,我目前正在github上阅读一篇关于使用Clang的扩展向量语法优化性能的文章。作者给出了以下代码片段: 下面的模板化代码实现了计算矩阵C中大小为regA x regB的补丁的最内部循环。该代码从矩阵x加载regA标量,从矩阵B加载regB SIMD width向量。该程序使用Clang的扩展向量语法 ///使用矢量化点积计算C的RAxRB块,其中RA是 ///从矩阵A加载的寄存器数,RB是寄存器数 ///从矩阵B加载。 模板 无效matmul_点_内部(整数k,常数浮点*a,整数lda,常数浮

我目前正在github上阅读一篇关于使用Clang的扩展向量语法优化性能的文章。作者给出了以下代码片段:

下面的模板化代码实现了计算矩阵C中大小为regA x regB的补丁的最内部循环。该代码从矩阵x加载regA标量,从矩阵B加载regB SIMD width向量。该程序使用Clang的扩展向量语法

///使用矢量化点积计算C的RAxRB块,其中RA是
///从矩阵A加载的寄存器数,RB是寄存器数
///从矩阵B加载。
模板
无效matmul_点_内部(整数k,常数浮点*a,整数lda,常数浮点*b,整数ldb,
浮点数*c,整数ldc){
浮动8 csum[regsA][regsB]={{0.0};
对于(int p=0;p
下面概述的代码最让我困惑。我阅读了整篇文章,理解了使用阻塞和计算小补丁背后的逻辑,但我不能完全理解这一点意味着什么:

    // Perform the DOT product.
for (int bi = 0; bi < regsB; bi++) {
  float8 bb = LoadFloat8(&B(p, bi * 8)); //the pointer to the range of values?
  for (int ai = 0; ai < regsA; ai++) {
    float8 aa = BroadcastFloat8(A(ai, p));
    csum[ai][bi] += aa * bb;
  }
}
//执行点积。
for(int bi=0;bi
}

有人能详细说明这里发生了什么吗?
文章可以在文章链接的第二条注释中找到,该注释将
float8
类型定义为

typedef float float8 __attribute__((ext_vector_type(8)));
(类似于immintrin.h如何定义
\uuuum256
)。并定义类似于
\u mm256\u load\u ps
\u mm256\u set1\u ps
的加载/广播功能。有了这个标题,您应该能够编译文章中的代码

看。GNUC本机向量语法是获取重载的
*
运算符的好方法。我不知道什么样的clang
ext\u vector\u type
,GCC/clang/ICC
float\u属性(vector\u width(32))
(32字节宽度)不会

这篇文章本来可以添加一个小部分来解释这一点,但它似乎更关注性能细节,而对解释如何使用语法并不感兴趣

本文中的大部分讨论是关于如何使用SIMD向量手动向量化matmul以提高缓存效率。从我的快速浏览来看,那部分看起来不错


您可以通过多种方式手动创建向量:GNU C本机向量或clang非常类似的“扩展”向量,或便携式Intel Intrinsic。非常感谢您的回复。我确实理解其含义,但是由于代码中没有太多注释,我受到这部分的挑战:$&B(p,bi*8));$$LoadFloat8$之后。我不明白它是什么意思。@Maria:
B
有一个重载的
操作符()
,它执行二维索引,对吗?它返回一个对浮点的引用。获取该浮点数的地址,并将其传递给一个内在函数,该函数从该浮点数开始加载8个浮点数。这看起来很正常,比如
\u mm\u load\u ps(&array[idx])
typedef float float8 __attribute__((ext_vector_type(8)));