Здесь на форуме нашел тему обсуждаюшую скорость копирования (мемкопи против цикла).
и у мну возник вопрос — а как скопировать массив с наибольшей скоростью? быстрее чем мемкопи можно или убыстрить его?
Небольшое уточнение по задачи: копироваться будут массивы разных типов, но однозначно больших размеров (под 200 метров), компилятор Visual Studio 2005 и gcc, объявление массива произвольно (программа на стадии разработки архитектуры, так что можно извращаться как хочешь, но усложнять не надо.)
Здравствуйте, Dejiko, Вы писали:
D>Здесь на форуме нашел тему обсуждаюшую скорость копирования (мемкопи против цикла).
D>и у мну возник вопрос — а как скопировать массив с наибольшей скоростью? быстрее чем мемкопи можно или убыстрить его?
Зависит от реализации memcpy. Здесь подробно, как и почему получить максимальную скорость на больших блоках.
D>Небольшое уточнение по задачи: копироваться будут массивы разных типов, но однозначно больших размеров (под 200 метров), компилятор Visual Studio 2005 и gcc
Про gcc не знаю, а MSVC2005 будет довольно быстро копировать, если SSE2, иначе — свой (скопированный из pdf ) вариант будет лучше. У Intel C++ довольно хорошая memcpy.
D> объявление массива произвольно (программа на стадии разработки архитектуры, так что можно извращаться как хочешь, но усложнять не надо.)
D>Буду благодарен за Ваши советы.
А без копирования таких объемов никак?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Dejiko, Вы писали:
D>Здесь на форуме нашел тему обсуждаюшую скорость копирования (мемкопи против цикла).
D>и у мну возник вопрос — а как скопировать массив с наибольшей скоростью? быстрее чем мемкопи можно или убыстрить его?
D>Небольшое уточнение по задачи: копироваться будут массивы разных типов, но однозначно больших размеров (под 200 метров), компилятор Visual Studio 2005 и gcc, объявление массива произвольно (программа на стадии разработки архитектуры, так что можно извращаться как хочешь, но усложнять не надо.)
D>Буду благодарен за Ваши советы.
Здравствуйте, Dejiko, Вы писали:
D>возник вопрос — а как скопировать массив с наибольшей скоростью? быстрее чем мемкопи можно или убыстрить его?
D>Небольшое уточнение по задачи: копироваться будут массивы разных типов, но однозначно больших размеров (под 200 метров)
Самый быстрый способ скопировать массив, особенно такой большой — это сделать так, чтобы его не пришлось копировать.
Re[2]: Про копирование массивов
От:
Аноним
Дата:
12.05.06 01:53
Оценка:
Здравствуйте, gear nuke, Вы писали:
GN>А без копирования таких объемов никак?
Никак. Вообше никак, даже если архитектуру изменить.
Re[2]: Про копирование массивов
От:
Аноним
Дата:
12.05.06 01:55
Оценка:
Здравствуйте, DigitalGuru, Вы писали:
DG>Здравствуйте, Dejiko, Вы писали:
DG>Если "программа на стадии разработки архитектуры", то оптимизация на таком уровне преждевременна. Может лучше подумать, как обойтись без копирования?
Никак нет. А вот потому что все ещё на стадии проектирования в выборе технологий мы не ограничены. Ведь всякая структура накладывает ограничения.
Re: Про копирование массивов
От:
Аноним
Дата:
12.05.06 02:00
Оценка:
Ещё одно уточнение. ЕСЛИ ЗАДАЛИ ВОПРОС ПРО КОПИРОВАНИЕ ТО НАДО ОТВЕЧАТЬ ПО ТЕМЕ А НЕ ГОВОРИТЬ ЧТО ЕГО НАДО УБРАТЬ. Копирование никак нельзя убрать из логики программы, конечно самый быстрый способ скопировать, бросить указатель, но надо чтоб была вторая физическая копия данных в оперативе.!!!
Здравствуйте, Аноним, Вы писали:
А>Ещё одно уточнение. ЕСЛИ ЗАДАЛИ ВОПРОС ПРО КОПИРОВАНИЕ ТО НАДО ОТВЕЧАТЬ ПО ТЕМЕ А НЕ ГОВОРИТЬ ЧТО ЕГО НАДО УБРАТЬ. Копирование никак нельзя убрать из логики программы, конечно самый быстрый способ скопировать, бросить указатель, но надо чтоб была вторая физическая копия данных в оперативе.!!!
на этапе выбора архитектуры можно и это предусмотреть
если нужно две три ... и большее количество копий
то память можно выделять на этапе инициализации и запомнить указатели
и соответственно менять указатели в тот или иной момент
если речь идет о заполнении массива тут что называется ничего не поделаешь
если массив читается из файла то имеет смысл посмотреть в сторону отображения файла на память
а что бы сделать memcpy быстрее имеет смысл во первых определиться с процессором
и соответсвенно переписать эту функцию на ассемблере с учетом расширенных команд и с учетом размерности
кэша процессора
а потом написать тест и посмотреть что быстрее
если бы вы обрисовали круг задач при котором вам необходима такое копирование
тогда может и ответы были бы более по существу
Здравствуйте, неуважаемый, Ананим, Вы писали:
А>Ещё одно уточнение. ЕСЛИ ЗАДАЛИ ВОПРОС ПРО КОПИРОВАНИЕ ТО НАДО ОТВЕЧАТЬ ПО ТЕМЕ А НЕ ГОВОРИТЬ ЧТО ЕГО НАДО УБРАТЬ. Копирование никак нельзя убрать из логики программы, конечно самый быстрый способ скопировать, бросить указатель, но надо чтоб была вторая физическая копия данных в оперативе.!!!
Ну, можно, к примеру, хранить не весь объем данных, а только изменения. Варианты есть разные, время проявить фантазию.
гыы...
продолжаем конкретезировать и отвергать предложенные варианты...
какой будет процессор неизвесно.
Задача: у вас есть вектор матриц aka трехмерная матрица aka некий кубический объем чисел. Вам надо обрезать со всех сторон по 2 ряда чилел. Уточнение: в оперативной памяти данная структура храница в виде линейного массива, есть оболочка доступа через [][][], можно ещё вручную адрес вычислять.
Вопрос — как кроме как копирования частей определенных из одномерного массива, старого, в новый такое действие сообразить??
Здравствуйте, Dejiko, Вы писали:
D>гыы... D>продолжаем конкретезировать и отвергать предложенные варианты... D>какой будет процессор неизвесно.
D>Задача: у вас есть вектор матриц aka трехмерная матрица aka некий кубический объем чисел. Вам надо обрезать со всех сторон по 2 ряда чилел. Уточнение: в оперативной памяти данная структура храница в виде линейного массива, есть оболочка доступа через [][][], можно ещё вручную адрес вычислять. D>Вопрос — как кроме как копирования частей определенных из одномерного массива, старого, в новый такое действие сообразить??