Контекст: многоканальная обработка цифровой аудио-аудио в реальном времени.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++. Форум разработчиков
1750054299
Anonymous
Контекст: многоканальная обработка цифровой аудио-аудио в реальном времени.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[s];
float bbuf1[b];
int main()
{
float sbuf2[s];
float bbuf2[b];
float * sbuf3 = new float[s];
float * bbuf3 = new float[b];
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[i] = k; // static memory
sbuf2[i] = k; // stack memory
sbuf3[i] = k; // heap memory
}
}
else
{
for (int k = 0; k < s * extra_it; ++k)
for (int i = 0; i < b; ++i)
{
bbuf1[i] = k; // static memory
bbuf2[i] = k; // stack memory
bbuf3[i] = 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[i] = 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[i] = 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[i] = k;
b2[i] = 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
Подробнее здесь: [url]https://stackoverflow.com/questions/34123191/seeking-knowledge-on-array-of-arrays-memory-performance[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия