jcmvbkbc, спасибо за ответ. ОЗУ 64 Гб на сервере. Используется из нее - максимум половина. Просто то быстрее, то медленнее к ней доступ (раз в 10). Вот и думаю что дело в кэше. Насчет, профилирования - вот именно доступ к массиву - скорость меняется. Все остальное одинаково.
Денис Загаевский, переделал в одномерный float *a = new float[5 000 000 000]; (размер - unsigned long long)
Стало работать быстрее, спасибо! Правда все равно падает скорость иногда. Как я понимаю проблема с кэшом процессора. Сколько он нужен для таких данных? Как это рассчитывать? У моего процессора 35Мб. Можете, пожалуйста, скинуть ссылки почитать про то, как настраивать кэш процессора.
Мне все эти данные нужны для операций, они рассчитываются от начала и до конца. Проход делаю в 10 потоках (рассчитываю индекс начала и конца каждой части, массив один - глобальная переменная).
Сейчас массив не фрагментирован, правильно?
devalone, Еще заметил что когда нормально (за 0.1 сек) выполняются операции - процессор нагружается на 10-15%. Когда за 1 сек - больше 40%.
Другие операции на сервере не выполняются. Так что процессор по-максиму свободен. ОЗУ тоже свободно достаточно (несколько ГБ).
Денис Загаевский, элементов же столько же останется. Почему тогда будет меньше кешов? Указатели в C++ кешируются? Если их не использовать некоторое время, то они чистятся?
Евгений Шатунов, массив состоит из float (float ***array).
Непрерывным блоком или набором фрагментированных блоков? Честно я не знаю, объявлял так - (new float**[m_index_max]; потом new float*[a]; потом new float[110];) Насчет позиций - они точно не пересекаются, потому что потоки делят массив на 10 частей и каждый поток работает со своей частью. А так позиций - с начала и до конца каждой части.