Accelerate Framework 可以基于单独的索引数组聚合数组值吗?

Posted

技术标签:

【中文标题】Accelerate Framework 可以基于单独的索引数组聚合数组值吗?【英文标题】:Can the Accelerate Framework aggregate array values based on a separate index array? 【发布时间】:2014-11-26 00:51:27 【问题描述】:

我正在尝试确定 Accelerate Framework 是否可以帮助加快我的应用必须执行的计算。假设我有以下数组:

invoice[0..n],包含发票值的双精度数组

week[0..n],一个整数数组,其中week[x] 保存invoice[x] 一年中的哪一周计费。

每周的发票数量是可变的。我有数以万计的发票。两个数组都按周排序。

Accelerate 框架是否可以帮助我计算每周的费用?

所以,例如,如果:

invoice = [10.0, 15.0, 10.0, 25.0, 40.0,   x, ...]
week    = [   0,    0,    0,    1,    1,   2, ...]

结果应该是:[35.0, 65.0, ...]

我浏览了文档,它似乎没有这个功能,但是,因为我对它完全陌生,所以我可能缺少一些技巧。

【问题讨论】:

【参考方案1】:

您是否尝试过类似的方法:

Float32 invoices[6] = 10.0, 15.0, 10.0, 25.0, 40.0, 80.0;
UInt8   weeks[6] = 0, 0, 0, 1, 1, 2;
Float32 *weeklyInvoicesAmount = calloc(52,sizeof(Float32));

int weekCounter = 0;
int invoiceCounter = 0;
int weeklyInvoice = 0;


while (weekCounter < 52)

    weeklyInvoice = 0;

    while (weeks[invoiceCounter] == weekCounter)
        weeklyInvoice += invoices [invoiceCounter++];

    weeklyInvoicesAmount[weekCounter] = weeklyInvoice;
    printf("Week :%i invoice: %f\n", weekCounter, weeklyInvoicesAmount[weekCounter]);
    ++weekCounter;


free(weeklyInvoicesAmount);

现在显然,您需要在阵列设置上做一些工作。

我问你是否尝试过 C 逻辑的原因是因为我通常发现逻辑 C + 编译器优化通常比单独使用 C 提供更好的结果 - 因为无论如何这是编译器在后台所做的......并且可能优化比我们做得更好......

编译器优化:项目 -> 构建设置 -> 优化级别 -> 将调试和发布更改为“-Os”。

我会从这个开始,使用不同的优化来衡量不同的马赫时间。

如果仍然很慢,我会在 Accelerate 框架中尝试 vDSP:

Accelerate Framework API

我认为任何矩阵计算都会遇到的问题是步幅可变,因此不能使用 vDSP_sve 之类的东西。

加速框架和矢量数学优化基于能够使用静态数量的元素来填充寄存器并同时进行计算。可变步幅否定了这一点。

希望对你有所帮助。

【讨论】:

谢谢。是的,我现在有类似的东西。我还在多个线程中处理数组的块。它相当快。我只是想知道是否有办法使用 SIMD 指令使其更快。

以上是关于Accelerate Framework 可以基于单独的索引数组聚合数组值吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 AVCaptureAudioDataOutput 数据传递到 vDSP / Accelerate.framework

Apple Accelerate Framework 缩放和规范化矢量

iOS - 使用 Accelerate.framework 对向量进行按位异或

为啥有时 Apple Accelerate 框架很慢?

Objective-C - 使用 Accelerate.framework 对两个矩阵进行元素加法(和除法)

有人可以解释这段代码如何使用 Accelerate Framework 将音量转换为分贝吗?