1

我正在尝试确定 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, ...]

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

4

1 回答 1

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:

加速框架 API

我认为任何矩阵计算都会遇到的问题是你有一个可变的步幅,所以你不能使用像 vDSP_sve 这样的东西。

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

希望其中一些有所帮助。

于 2014-11-26T08:16:09.997 回答