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

在C中添加两个浮点数组的有效方法?

在C中添加两个浮点数组的有效方法?,c,performance,audio,C,Performance,Audio,我的macOS音频应用程序使用for循环添加两个浮点数组。当大小很大时,有没有更有效的方法 int size = 5; float array1[size] = {0.0, 0.1, 0.2, 0.3, 0.4}; float array2[size] = {0.5, 0.6, 0.7, 0.8, 0.9}; float sum[size]; for (int i = 0; i < size; i ++) { sum[i] = array1[i] + array2[i]; }

我的macOS音频应用程序使用for循环添加两个浮点数组。当
大小
很大时,有没有更有效的方法

int size = 5;
float array1[size] = {0.0, 0.1, 0.2, 0.3, 0.4};
float array2[size] = {0.5, 0.6, 0.7, 0.8, 0.9};
float sum[size];

for (int i = 0; i < size; i ++)
{
    sum[i] = array1[i] + array2[i];
}
int size=5;
浮点数组1[size]={0.0,0.1,0.2,0.3,0.4};
浮点数组2[size]={0.5,0.6,0.7,0.8,0.9};
浮点数[大小];
对于(int i=0;i
如果在功率超过几瓦的硬件上运行(除了一部10年的手机,没有内置FPU,也没有知道如何利用CPU奇异指令的编译器),效率将取决于内存缓存和总线带宽,所以聪明的C技巧并不重要。唯一有意义的加速是覆盖其中一个数组:

。。。阵列1[i]+=阵列2[i]

您可以做的最重要的技巧:如果这些数组实际上是指针,并且您将它们传递到函数中,如果确实应该指向独立于2:

void do_sum(size_t size,
            float * restrict sum,
            float * array1,
            float * array2)
或者有尺寸提示

void do_sum(size_t size,
            float sum[restrict static size],
            float array1[static size],
            float array2[static size])
这将使编译器能够生成效率更高的代码,因为它保证无论是
array1[n]
还是
array2[n]
都不能为函数中使用的任何
n
k
访问与
sum[k]
相同的内存

您可以在Godbolt:和

上看到不同之处。对于macOS(如评论中所阐明的),解决方案很简单,至少对于单个添加操作是如此。将
#include插入到项目中,并将循环更改为对
vDSP_vadd的单个调用(sum,1,array1,1,array2,1,size)。它使用了一个高性能的矢量化例程,苹果为其支持的每个平台定制该例程

1
参数是以元素为单位在数组中的步长。
1
表示处理每个元素,是性能的最佳情况。)


因为您使用最多524288个元素,还应该考虑应用程序如何与缓存内存交互。高性能设计不能孤立地进行,只能单独查看每个例程。

你有一个非常奇怪的数组索引,你知道吗?哦,你完全正确。我应该编辑它。在我的应用程序中,我处理的是指针和memcpy,这就是为什么我使用这种方式。我会编辑它。一句话:您只需要使用正确的编译器选项,并让优化器来完成这项工作。像这样的优化在很大程度上取决于环境。你的目标是什么处理器?程序在这方面还做了什么?它在对一些相同的数据进行其他操作吗?阵列有多大?现代处理器通常具有快速添加阵列的功能,但如何以及是否使用这些功能取决于具体情况。非便携式解决方案是否可以接受,例如使用英特尔AVX指令的解决方案?使用编译器扩展可以吗?编译器会自动矢量化循环吗?@EricPostpischil这是专为macOS设计的。所以英特尔核心i5和i7s。阵列大小高达524288。我唯一要做的就是求和。我不确定其他的东西,因为我以前从来没有深入过。亲爱的。谢谢你的提示。