Контекст: многоканальная обработка цифровой аудио-аудио в реальном времени.for (int sample = 0; sample < size; ++sample)
{
for (int channel = 0; channel < size; ++channel)
{
auto data = arr[channel][sample];
// do some computations
}
}
< /code>
Я ищу советы о том, как сделать жизнь проще для процессора и памяти в целом. Я понимаю, что чередование данных будет лучше, но это невозможно. < /p>
Моя теория такова, что, пока вы последовательно получаете память на некоторое время, ЦП будет предварительно перераспределять его - будет ли это удерживаться для буферов N (канала)? Как насчет размера буферов, любых «разбитых моментов»? < /p>
будет очень полезно иметь каналы в смежной памяти (увеличение местности), или это содержится только для очень маленьких буферов (например, размер линий кеша)? Мы могли бы говорить о буферах> 100 кб друг от друга. Таким образом, любой выбор дизайна, который я делаю, может только положительно повлиять на эту конкретную систему. Любые знания по этим вопросам ценятся, ссылки, литература и т. Д., Специфические знания платформы. < /P>
Дайте мне знать, если вопрос слишком расплывчат, я в первую очередь думал, что было бы неплохо иметь некоторый опыт /информация о WikiSISH /Info. Три случая, которые я упомянул (далекий, смежный и смежный, упомянутый в предположительно увеличивающемся порядке производительности), в котором эти паттерны проверяют малые и большие наборы данных. Может быть, люди будут запускать это и сообщать о аномалиях. < /P>
#include
#include
#include
const int b = 196000;
const int s = 64 / sizeof(float);
const int extra_it = 16;
float sbuf1;
float bbuf1;
int main()
{
float sbuf2;
float bbuf2;
float * sbuf3 = new float;
float * bbuf3 = new float;
float * sbuf4 = new float[s * 3];
float * bbuf4 = new float[b * 3];
float use = 0;
while (1)
{
using namespace std;
int c;
bool sorb;
cout > sorb))
return -1;
cout c))
return -1;
auto t = std::chrono::high_resolution_clock::now();
if (c == 0)
{
// "worst case scenario", 3 distant buffers constantly touched
if (sorb)
{
for (int k = 0; k < b * extra_it; ++k)
for (int i = 0; i < s; ++i)
{
sbuf1 = k; // static memory
sbuf2 = k; // stack memory
sbuf3 = k; // heap memory
}
}
else
{
for (int k = 0; k < s * extra_it; ++k)
for (int i = 0; i < b; ++i)
{
bbuf1 = k; // static memory
bbuf2 = k; // stack memory
bbuf3 = k; // heap memory
}
}
}
else if (c == 1)
{
// "best case scenario", only contiguous memory touched, interleaved
if (sorb)
{
for (int k = 0; k < b * extra_it; ++k)
for (int i = 0; i < s * 3; i += 3)
{
sbuf4 = k;
sbuf4[i + 1] = k;
sbuf4[i + 2] = k;
}
}
else
{
for (int k = 0; k < s * extra_it; ++k)
for (int i = 0; i < b * 3; i += 3)
{
bbuf4 = k;
bbuf4[i + 1] = k;
bbuf4[i + 2] = k;
}
}
}
else if (c == 2)
{
// "compromise", adjecant memory buffers touched
if (sorb)
{
auto b1 = sbuf4;
auto b2 = sbuf4 + s;
auto b3 = sbuf4 + s * 2;
for (int k = 0; k < b * extra_it; ++k)
for (int i = 0; i < s; ++i)
{
b1 = k;
b2 = k;
b3[i] = k;
}
}
else
{
auto b1 = bbuf4;
auto b2 = bbuf4 + b;
auto b3 = bbuf4 + b * 2;
for (int k = 0; k < s * extra_it; ++k)
for (int i = 0; i < b; ++i)
{
b1[i] = k;
b2[i] = k;
b3[i] = k;
}
}
}
else
break;
cout
Подробнее здесь: https://stackoverflow.com/questions/341 ... erformance
Поиск знаний о массивах массивов памяти ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Синтаксис C++, двойной доступ к памяти с использованием круглых скобок в массивах
Anonymous » » в форуме C++ - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-