Может ли Accelerate Framework агрегировать значения массива на основе отдельного массива индексов?

Я пытаюсь определить, может ли 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, ...]

Я просмотрел документацию, и, похоже, у нее нет такой возможности, но, поскольку я совершенно новичок в этом, может быть какой-то трюк, который я упускаю.


person Eduardo    schedule 26.11.2014    source источник


Ответы (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 - поскольку это то, что компилятор все равно делает в фоновом режиме... И, вероятно, оптимизирует лучше, чем мы могу....

Оптимизация компилятора: проект -> настройки сборки -> уровень оптимизации -> изменить Debug и Release на "-Os".

Я бы начал с этого и измерил разное время маха, используя разные оптимизации.

Если он все еще медленный, я бы попробовал vDSP в среде Accelerate:

Accelerate Framework API

Я думаю, что проблема, с которой вы столкнетесь при любых матричных вычислениях, заключается в том, что у вас есть переменный шаг, поэтому вы не можете использовать что-то вроде vDSP_sve.

Оптимизация фреймворка Accelerate и векторной математики основана на возможности использовать статическое количество элементов для заполнения регистров и одновременных вычислений. Переменный шаг отрицает это.

Надеюсь, что-то из этого поможет.

person Khaled Barazi    schedule 26.11.2014
comment
Спасибо. Да, у меня сейчас что-то похожее на это. Я также обрабатываю куски массива в несколько потоков. Это достаточно быстро. Мне просто интересно, есть ли способ сделать это еще быстрее с помощью SIMD-инструкций. - person Eduardo; 26.11.2014