Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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_Math_Memory_Optimization - Fatal编程技术网

在C语言中优化向量/矩阵运算?

在C语言中优化向量/矩阵运算?,c,math,memory,optimization,C,Math,Memory,Optimization,我想看看我是否可以作为一个项目优化C语言中的数学向量(和/或矩阵)运算。例如,我注意到,memcpy比循环快得多,因为它使用低级硬件辅助内存操作,但我对它的工作原理不太熟悉 如果不是将两个浮点数组相加或相乘(而不是复制)之类的操作,是否可能执行类似操作?我从您的配置文件中看到您正在处理opengl,我写了以下答案,假设您要处理线性代数。在你的情况下,没有别的办法 循环展开 防止间接索引 目标内存缓存 编译器/链接器优化 你正处于一个巨大研究领域的边缘。您可以在“计算线性代数”、“矩阵存储方

我想看看我是否可以作为一个项目优化C语言中的数学向量(和/或矩阵)运算。例如,我注意到,
memcpy
比循环快得多,因为它使用低级硬件辅助内存操作,但我对它的工作原理不太熟悉


如果不是将两个浮点数组相加或相乘(而不是复制)之类的操作,是否可能执行类似操作?

我从您的配置文件中看到您正在处理opengl,我写了以下答案,假设您要处理线性代数。在你的情况下,没有别的办法

  • 循环展开
  • 防止间接索引
  • 目标内存缓存
  • 编译器/链接器优化

你正处于一个巨大研究领域的边缘。您可以在“计算线性代数”、“矩阵存储方案”、“矩阵向量运算”等文献中搜索数百万份出版物

可能有数千个库、工具和实用程序试图优化这些计算。
然而,一组低级库BLAS被接受为标准密集矩阵库。大量密集和稀疏的vec、mat vec、mat mat功能都建立在它之上。单处理器或多处理器工具都可用。(并发和分布式)甚至支持GPU的解决方案也已经存在

杰克·东加拉是这方面的领先研究者之一。我相信你可以通过上面给你的关键词找到很多来源

顺便说一句,没有像memcpy这样的优化,因为它是一种内置功能。如果文献中存在类似的东西,BLAS中也会有


BLAS通过编译器/链接器为特定的操作系统和硬件提供了几种优化(如循环展开、缓存等)

首选方法是使用某个人已经开发的库,并花费一些时间调整以获得更好的性能

然而,如果您有兴趣自己做这件事,最简单的优化之一就是增加指针,而不是使用偏移量数学(Semih Ozmen在下面称之为间接寻址)。例如,考虑添加两个向量<代码> < <代码> > <代码> b>代码>长度>代码> n>代码>,并将结果放在第三向量>代码> c>代码>长度>代码> n< /代码>。天真的做法是:

for (unsigned int i = 0; i < N; ++i) {
    c[i] = a[i] + b[i];
}
for(无符号整数i=0;i
这里,每个数组元素的内存位置必须计算为基本内存地址加上基于目标数组元素索引和数组数据元素大小的偏移量。另一种方法是使用指针,如下所示:

double *ap = a, *bp = b, *cp = c;
for (unsigned int i = 0; i<N; ++i, ++ap, ++bp, ++cp) {
    *cp = *ap + *bp;
}
double*ap=a,*bp=b,*cp=c;

对于(unsigned int i=0;ii如果您希望获得性能,并且不想在低级别优化中弄脏手脚,请使用向量/矩阵库。提供了一些有关分析的有用提示,确保您的数据布局利用SSE指令(假设您的平台上有这些指令),删除/优化条件等。因此值得一读。您是否在启用完全优化的情况下测试了循环的性能?一个好的编译器应该能够为一个简单循环生成与memcpy使用的代码基本相同的代码。就@Sefu的知识而言,此优化是为了消除“间接寻址”或“间接索引”