Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Коллеги, день добрый. Подскажите, плиз, как можно в Linux, на чистом си (т.е. НЕ с++), реализовать следующее. Выделить одну непрерывную область памяти и в ней расположить свои переменные (целые, вещественные) и данные в том порядке, который мне необходим. И это вообще – реализуемо? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 17:17 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Объявляешь struct с полями нужного типа в нужном порядке. Потом выделяешь под него память. В чём проблема-то? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 17:41 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Хмм.... Загнать все переменные из кода в одну структуру - ну ладно, это я еще можно попробовать. Хотя с трудом представляю, как математику в таком формате обсчитывать. Кроме того, если правильно помню, структура на стеке размечается, а он довольно небольшой по размерам. хоть и неудобно будет. А вот у данных - своя структура организации и динамики изменения в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:04 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Загнать все переменные из кода в одну структуру - ну ладно, это я еще можно попробовать. Хотя с трудом представляю, как математику в таком формате обсчитывать. Ну, ты же сам пожелал странного: "выделить одну непрерывную область памяти и в ней расположить свои переменные". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:16 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Объясните яснее свою задачу. последний пост - какой-то полностью неосмысленный набор слов. IMHO p.s. "структура" и "на стеке" понятия совершенно перпендикулярные ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:17 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70, форум в смятении. Вы усугубили требование аллокации, добавив туда свои пожелания по "непрерывности". И насколько глубоко мы должны ее обеспечить? Чтобы адреса ячеек шли подряд? Или может быть чтобы битики в матрице рядышком стояли. Или чтоб на 1 планке памяти или на 1 кристале вас массивчик лежал. Вобщем проясните ваш причудливый каприз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:38 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, объект структура в безвоздушном пространстве хранятся? А я думал в памяти. Только вот она разная, эта память. Поэтому особой "перпендикулярности" я не вижу. Задача - в первом посте сформулирована. Если говорить о предметной области - то это много специфичной математики, часть данных онлайн поступает по сети. Хочу разнести в памяти и правильно переложить данные, чтобы по максимуму кеши процессорные задействовать. Отсюда и вопрос. Как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:39 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Как-то так. Тогда любая переменная, включая простые, структурированные и типа массив хранятся в памяти непрерывно. malloc() и Ко тоже выделяют непрерывные области памяти. Что полностью удовлетворяет требования задачи, сформулированной в первом посте. Как-то так. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:42 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70чтобы по максимуму кеши процессорные задействовать Чаво задействовать ? Почитай про calloc()/malloc() А лучше какую-нибудь книжку по Си. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:55 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, извини, конечно, за прямоту. Твой ответ называется "ответом программиста" - абсолютно точный и настолько же бесполезный. Есть данные. Поступают они с разной интенсивностью, которая в первом приближении - понятна. Когда данные криво лежат, проц постоянно промахивается по кешу, кроме того, забирает из памяти данные, которые ему сейчас не нужны. Как минимум, я хочу разнести данные с разной интенсивностью обновления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:55 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Dima T, )))))))))))))))))))))))))))))))))) В книгах по Си об этом не пишут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 18:56 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Dima T, )))))))))))))))))))))))))))))))))) В книгах по Си об этом не пишут. О чем этом? Набери в гугле "calloc()" или "malloc()" но лучше возьми вторую книгу (если попалась та где не пишут, сомневаюсь что такая есть). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 19:19 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Когда данные криво лежат, проц постоянно промахивается по кешу, кроме того, забирает из памяти данные, которые ему сейчас не нужны. Как минимум, я хочу разнести данные с разной интенсивностью обновления. Непрерывный кусок можно выделить calloc()/malloc() или просто в стэке. Другой вопрос как ты этим куском будешь пользоваться, кроме того есть размер кэша проца, куда не только твой кусок данных лезет, но и куски кода, которые их обрабатывают. И куски данных/кода других процессов кторые выполняются в это же время параллельно. Нельзя сказать процу "этот кусок всегда держи в кэше", да и кэшей у него несколько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 19:26 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Как минимум, я хочу разнести данные с разной интенсивностью обновления. преждевременная оптимизация разберитесь сначала с распределением памяти (стек, куча), указателями и адресной арифметикой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 19:28 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Когда данные криво лежат, проц постоянно промахивается по кешу, кроме того, забирает из памяти данные, которые ему сейчас не нужны. А почему ты думаешь, что кэш процессора способен хранить только непрерывные области памяти?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 19:32 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Изопропилразберитесь сначала с распределением памяти (стек, куча), указателями и адресной арифметикой +1 Читай книжки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 19:49 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Хочу разнести в памяти и правильно переложить данные, чтобы по максимуму кеши процессорные задействовать. Могу посоветовать ознакомиться: RAM - не RAM, или Cache-Conscious Data Structures ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 19:58 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Коллеги, я конечно, все понимаю...... И про адресную арифметику я знаю..... Понятно, что на поверхности простое решение: выделил несколько кусков памяти по типам переменных, бегай указателями и пиши-читай что надо. Вопрос - возможно ли в одном куске. У меня был простой и понятный вопрос в первом посте... Смысл углубляться и обсуждать вопрос - надо не это, или нет? Если никто из вас не сталкивался с задачами оптимизации кеша - просто так и скажите. Я по вопросам вижу, что большая часть даже предмета не представляет, что-то там про книги советуют.... Если кто уже это делал - посоветуйте, если нет - давайте закроем тему и не будем тратить время друг друга. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 22:01 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Вопрос - возможно ли в одном куске. зачем несколько кусков по типам - массив структур используйте в структуре - выравнивание с учётом размера линии кэша, память - выделяйте memalign ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 22:43 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Вопрос - возможно ли в одном куске.так структура то чем не подошла? Хинт: вот это: Кроме того, если правильно помню, структура на стеке размечаетсяошибка, есичё. Хочешь - на стеке размещай, хочешь - в куче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 22:45 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Вопрос - возможно ли в одном куске. Еще раз про "один кусок". Своим malloc выделяем один кусок нужного нам размера и дальше у же в нем производим запросы на n других кусков ... /понятно, что если "одного куска" будет не достаточно, то .../ Автор topic на мой взгляд хочет понять как интерпретаторы решают вопрос распределения и использования памяти под переменные. PS: Автору topic. Если вас правильно понял, то вот и поищите в inet ответ на этот вопросю Информации валом ... Загляните к Кнуту ... ... ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2015, 22:57 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Коллеги, я конечно, все понимаю...... И про адресную арифметику я знаю..... Понятно, что на поверхности простое решение: выделил несколько кусков памяти по типам переменных, бегай указателями и пиши-читай что надо. Вопрос - возможно ли в одном куске. У меня был простой и понятный вопрос в первом посте... Смысл углубляться и обсуждать вопрос - надо не это, или нет? Если никто из вас не сталкивался с задачами оптимизации кеша - просто так и скажите. Я по вопросам вижу, что большая часть даже предмета не представляет, что-то там про книги советуют.... Если кто уже это делал - посоветуйте, если нет - давайте закроем тему и не будем тратить время друг друга. Спасибо Ваш вопрос понятен. Это можно сделать например так Код: plaintext 1. 2. 3. 4. 5. Но дело в том, что все данные в памяти это уровень сигнала, или нули и единицы, потому при записи/чтении данных в память необходимо знать с каким типом данных вы работаете. Вам придётся сопровождать вспомогательный массив в котором будет храниться тип данных конкретного элемента и сдвиг внутри основного массива. Либо можно разбить массив на три логических куска, но это вам видимо не подойдёт. Может быть используете такой вариант, но это не совсем то что вы хотите Код: plaintext 1. 2. 3. 4. 5. 6. Не уверен что вы узнаете что-то новое (хотя Anatoly Moskovsky и MasterZiv ещё ничего не сказали, они могут знать что-то ещё), и дело не в том что вы пишите о том, что кто-то вас не понимает, вас прекрасно понимают, и то что вы просите реализовать возможно, пожалуй, только способом предложенным выше, что не очень удобно. Расскажите нам как вы решите данную задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 02:25 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
SashaMercury(хотя Anatoly Moskovsky и MasterZiv ещё ничего не сказали Не сказали потому что решение приведено в первом же ответе, и потом еще как минимум раз. Чего по сто раз повторять, если со второго раза не доходит )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 05:40 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, я могу лишь в десятый раз сказать прямо: кэширование не управляется никак. Если ты будешь подгонять программу под структуру кэша одной машины, то на другой машине это уже не будет работать, и соответственно оптимизация бессмысленна. К тому же, как уже не раз говорено, главный источник оптимизации программы - это алгоритм обработки данных, и возможно кэширование в памяти вместо чтения с диска, там разница в доступе в миллионы раз. А кэш или не кэш - в десятки раз, что немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 07:39 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
MasterZivА кэш или не кэш - в десятки раз, что немного. Наверно можно в синтетических тестах до 10 раз ускориться, но в реале максимум в 2-3 раза на современном железе. Например у меня при поиске простых двухкратное ускорение получилось за счет уменьшения окна обсчитываемого за раз. Это при том что количество мат.операций заметно увеличивалось. Я так понимаю окно просто стало целиком влезать в кэш проца. ИМХУ попадание в кэш проца было актуально когда память была DDR2, на DDR3 работало намного шустрее с тем же процом. Сейчас уже на подходе DDR4 с частотой 3 ГГц, с такой памятью разница в скоростях обращения к кэшу и к памяти вообще станет незначительной. MasterZivглавный источник оптимизации программы - это алгоритм обработки данных И надо оптимизироваться в сторону распараллеливания, т.к. ускорение процов и памяти свыше 3-4 ГГц не стоит ожидать в ближайшем обозримом будущем. А многоядерные процы готовы выпускать все, только применения им практически нет, т.к. очень мало задач хорошо поддающихся распараллеливанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 08:17 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
S70Dimitry Sibiryakov, извини, конечно, за прямоту. Твой ответ называется "ответом программиста" - абсолютно точный и настолько же бесполезный. Есть данные. Поступают они с разной интенсивностью, которая в первом приближении - понятна. Когда данные криво лежат, проц постоянно промахивается по кешу, кроме того, забирает из памяти данные, которые ему сейчас не нужны. Как минимум, я хочу разнести данные с разной интенсивностью обновления. Насколько я помню, L1 кеш имеет/имел линию в 32 байт. Т.ч. все что больше - глубоко пофиг будут рядом или не рядом (TLB пока не рассматриваем). Про оптимизацию под L2 / L3 кеш я как-то даже и не слышал Кроме того, в процессоре out of order execution. Если для какой-то инструкции данные еще не прибыли, но есть следующие инструкции которые можно выполнить - процессор все равно простаивать не будет. Локальные и глобальные переменные модуля (.C файл) - все равно лежат "рядом". Компилятор и будет их размешать ровно так, так они описаны в приложении. Тут главное не словить промахи при выполнении, но это нужно брать реальное приложение и запускать под чем нибудь типа Intel VTune (пользовался в начале 2000-х). Промахи могут быть совершенно "экзотические" и крайне удивительные. Лично я напарывался на промах обращения к выравненным данным после обращения к невыравненным (алгоритм такой был). Так там наоборот: то что данные попали в одну линию кеша - как раз и было проблемой. Попадали бы в разные линии, промаха бы не было ))) Т.ч. самая главная "оптимизация" не плодить лишних переменных и сущности ))) Если речь идет о выделении памяти через new / mallloc - тут тоже все сказали. Просто выделяйте одну область и ее используйте. S70Поступают они с разной интенсивностью, которая в первом приближении - понятна. Когда данные криво лежат, проц постоянно промахивается по кешу Тут ключевой вопрос ОТКУДА и КАК поступают данные. Если данные поступают по сети - тут не ЯДРО проца по кешу может промахнуться, а прерывание от сетевой карты не на то ядро придти ))) (если проц многоядерный). А при таком "промахе" никакой кеш не поможет, ядро совсем другое Если же система многозадачная, то как бы Вы не оптимизировали, скорее всего в промежутках между поступлениями данных все кеши уже кто нибудь выбьет напрочь (другой поток, ОС, сетевой драйвер и так далее). Если данные приходят по сети (а она скорее всего TCP/IP) Оптимизировать можно, но тут проблемы AFAIK совсем другого уровня. Взаимодействие железа + прерывания + ядро проца + драйвер + ОС + прикладной софт. Но AFAIK этим занимаются только производители ОЧЕНЬ дорогого и специфического железа. Всякая китайская дешевка ))) типа Ethernet 10 G и их драйвера на такое внимание не обращают. Т.ч. там хоть оптимизируй прикладной соофт хоть нет - ничто не поможет ))). Только выкидывать нафиг устаревший TCP/IP и переходить на что нибудь более современное ))) AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 13:28 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНасколько я помню, L1 кеш имеет/имел линию в 32 байт. в i7 L1,L2,L3 имеют линию 64 байта. для борьбы с TLB - большие страницы выделять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:21 |
|
||
|
Размещение в памяти переменных на чистом Си
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevТолько выкидывать нафиг устаревший TCP/IP и переходить на что нибудь более современное ))) PGM , например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2015, 15:25 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018991]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 176ms |

| 0 / 0 |
