Допустим, я умножил два массива, таких как A[MAX_BUFFER]
и B[MAX_BUFFER]
(с MAX_BUFFER = 256
).
По какой-то причине каждое значение B[MAX_BUFFER]
рассчитывается с фиксированной контрольной скоростью (например, 8
), поскольку каждое значение будет подвергаться интенсивной обработке.
Позже мне нужно умножить друг друга на C[MAX_BUFFER]
, учитывая (введенный) разный интервал. Так что с A
на 256 значениях я получу B
с переменным размером (32 в нашем примере, так как контрольная скорость равна 8).
Вот пример кода :
#include <iostream>
#include <math.h>
#define MAX_BUFFER 256
double HeavyFunction(double value) {
if (value == 0) return 0.0;
return pow(10.0, value); // heavy operations on value...
}
int main()
{
int blockSize = 256;
int controlRate = 8;
double A[MAX_BUFFER];
double B[MAX_BUFFER];
double C[MAX_BUFFER];
// fill A
for (int sampleIndex = 0; sampleIndex < blockSize; sampleIndex++) {
A[sampleIndex] = sampleIndex;
}
// fill B (control rated)
int index = 0;
for (int sampleIndex = 0; sampleIndex < blockSize; sampleIndex += controlRate, index++) {
B[index] = HeavyFunction(index);
}
// calculate C
for (int sampleIndex = 0; sampleIndex < blockSize; sampleIndex++) {
C[sampleIndex] = A[sampleIndex] + B[sampleIndex / 8];
std::cout << C[sampleIndex] << std::endl;
}
}
Мне нужна производительность, так как я буду обрабатывать множество этих операций параллельно, посылая множество данных за 1 секунду (что-то вроде 44100 выборок, разбитых на blockSize
<= <code>MAX_BUFFER).
Я бы хотел избежать ветвления (т. Е. if
) и деления (как в примере выше), которые не являются процессами, подобными процессорам (обработка большого количества данных).
В предыдущем примере это введет sampleIndex / 8 * N
«бесполезную» N-операцию; вещи, если я назову эту процедуру для миллионов образцов ...
Как бы вы перестроили этот код причудливым и легким способом для процессора?