你有没有尝试过类似的东西:
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 这样的东西。
加速框架和矢量数学优化基于能够使用静态数量的元素来填充寄存器并同时进行计算。可变步幅否定了这一点。
希望其中一些有所帮助。