Про копирование массивов
От: Dejiko  
Дата: 10.05.06 22:31
Оценка:
Здесь на форуме нашел тему обсуждаюшую скорость копирования (мемкопи против цикла).

и у мну возник вопрос — а как скопировать массив с наибольшей скоростью? быстрее чем мемкопи можно или убыстрить его?

Небольшое уточнение по задачи: копироваться будут массивы разных типов, но однозначно больших размеров (под 200 метров), компилятор Visual Studio 2005 и gcc, объявление массива произвольно (программа на стадии разработки архитектуры, так что можно извращаться как хочешь, но усложнять не надо.)

Буду благодарен за Ваши советы.
Re: Про копирование массивов
От: gear nuke  
Дата: 11.05.06 02:56
Оценка: 6 (1) +1
Здравствуйте, 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
Re: Про копирование массивов
От: DigitalGuru Россия http://svetlyak.ru
Дата: 11.05.06 05:49
Оценка: 1 (1) +1
Здравствуйте, Dejiko, Вы писали:

Если "программа на стадии разработки архитектуры", то оптимизация на таком уровне преждевременна. Может лучше подумать, как обойтись без копирования?
Re: Про копирование массивов
От: Bell Россия  
Дата: 11.05.06 06:24
Оценка:
Здравствуйте, Dejiko, Вы писали:

D>Здесь на форуме нашел тему обсуждаюшую скорость копирования (мемкопи против цикла).


D>и у мну возник вопрос — а как скопировать массив с наибольшей скоростью? быстрее чем мемкопи можно или убыстрить его?


D>Небольшое уточнение по задачи: копироваться будут массивы разных типов, но однозначно больших размеров (под 200 метров), компилятор Visual Studio 2005 и gcc, объявление массива произвольно (программа на стадии разработки архитектуры, так что можно извращаться как хочешь, но усложнять не надо.)


D>Буду благодарен за Ваши советы.


Посмотри здесь
Любите книгу — источник знаний (с) М.Горький
Re: Про копирование массивов
От: Centaur Россия  
Дата: 11.05.06 07:43
Оценка:
Здравствуйте, 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
Оценка:
Ещё одно уточнение. ЕСЛИ ЗАДАЛИ ВОПРОС ПРО КОПИРОВАНИЕ ТО НАДО ОТВЕЧАТЬ ПО ТЕМЕ А НЕ ГОВОРИТЬ ЧТО ЕГО НАДО УБРАТЬ. Копирование никак нельзя убрать из логики программы, конечно самый быстрый способ скопировать, бросить указатель, но надо чтоб была вторая физическая копия данных в оперативе.!!!
Re[2]: Про копирование массивов
От: ioni Россия  
Дата: 12.05.06 05:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ещё одно уточнение. ЕСЛИ ЗАДАЛИ ВОПРОС ПРО КОПИРОВАНИЕ ТО НАДО ОТВЕЧАТЬ ПО ТЕМЕ А НЕ ГОВОРИТЬ ЧТО ЕГО НАДО УБРАТЬ. Копирование никак нельзя убрать из логики программы, конечно самый быстрый способ скопировать, бросить указатель, но надо чтоб была вторая физическая копия данных в оперативе.!!!


на этапе выбора архитектуры можно и это предусмотреть
если нужно две три ... и большее количество копий
то память можно выделять на этапе инициализации и запомнить указатели
и соответственно менять указатели в тот или иной момент

если речь идет о заполнении массива тут что называется ничего не поделаешь

если массив читается из файла то имеет смысл посмотреть в сторону отображения файла на память

а что бы сделать memcpy быстрее имеет смысл во первых определиться с процессором
и соответсвенно переписать эту функцию на ассемблере с учетом расширенных команд и с учетом размерности
кэша процессора
а потом написать тест и посмотреть что быстрее

если бы вы обрисовали круг задач при котором вам необходима такое копирование
тогда может и ответы были бы более по существу
Re[2]: Про копирование массивов
От: DigitalGuru Россия http://svetlyak.ru
Дата: 12.05.06 05:51
Оценка:
Здравствуйте, неуважаемый, Ананим, Вы писали:

А>Ещё одно уточнение. ЕСЛИ ЗАДАЛИ ВОПРОС ПРО КОПИРОВАНИЕ ТО НАДО ОТВЕЧАТЬ ПО ТЕМЕ А НЕ ГОВОРИТЬ ЧТО ЕГО НАДО УБРАТЬ. Копирование никак нельзя убрать из логики программы, конечно самый быстрый способ скопировать, бросить указатель, но надо чтоб была вторая физическая копия данных в оперативе.!!!


Ну, можно, к примеру, хранить не весь объем данных, а только изменения. Варианты есть разные, время проявить фантазию.
Re: Про копирование массивов
От: Dejiko  
Дата: 16.05.06 07:34
Оценка:
гыы...
продолжаем конкретезировать и отвергать предложенные варианты...
какой будет процессор неизвесно.

Задача: у вас есть вектор матриц aka трехмерная матрица aka некий кубический объем чисел. Вам надо обрезать со всех сторон по 2 ряда чилел. Уточнение: в оперативной памяти данная структура храница в виде линейного массива, есть оболочка доступа через [][][], можно ещё вручную адрес вычислять.
Вопрос — как кроме как копирования частей определенных из одномерного массива, старого, в новый такое действие сообразить??
Re[2]: Про копирование массивов
От: Centaur Россия  
Дата: 16.05.06 09:00
Оценка:
Здравствуйте, Dejiko, Вы писали:

D>гыы...

D>продолжаем конкретезировать и отвергать предложенные варианты...
D>какой будет процессор неизвесно.

D>Задача: у вас есть вектор матриц aka трехмерная матрица aka некий кубический объем чисел. Вам надо обрезать со всех сторон по 2 ряда чилел. Уточнение: в оперативной памяти данная структура храница в виде линейного массива, есть оболочка доступа через [][][], можно ещё вручную адрес вычислять.

D>Вопрос — как кроме как копирования частей определенных из одномерного массива, старого, в новый такое действие сообразить??

Делается новая оболочка доступа через [][][].

template <typename T>
class ArrayView1D
{
private:
  T* ptr_;
  size_t size_;
public:
  ArrayView1D(T* ptr, size_t size)
  : ptr_(ptr), size_(size)
  {}
  T& operator[](size_t index) { return ptr_[index]; }
  ArrayView1D subview(size_t start, size_t size)
  {
    return ArrayView1D(ptr_ + start, size);
  }
};

template <typename T>
class ArrayView2D
{
private:
  T* ptr_;
  size_t size0_, size1_;
  ptrdiff_t step1_;
public:
  ArrayView2D(T* ptr, size_t size0,
    ptrdiff_t step1, size_t size1)
  : ptr_(ptr), size0_(size0),
    size1_(size1), step1_(step1)
  {}
  ArrayView1D<T> operator[](size_t index)
  {
    return ArrayView1D<T>(ptr_ + step1 * index, size0);
  }
  ArrayView2D subview(size_t start0, size_t size0,
    size_t start1, size_t size1)
  {
    return ArrayView2D(ptr_ + step1_ * start1 + start0,
      size0, step1_, size1);
  }
};

template <typename T>
class ArrayView3D
{
private:
  T* ptr_;
  size_t size0_, size1_, size2_;
  ptrdiff_t step1_, step2_;
public:
  ArrayView3D(T* ptr, size_t size0,
    ptrdiff_t step1, size_t size1,
    ptrdiff_t step2, size_t size2)
  : ptr_(ptr), size0_(size0),
    size1_(size1), size2_(size2),
    step1_(step1), step2_(step2)
  {}
  ArrayView2D<T> operator[](size_t index)
  {
    return ArrayView2D<T>(ptr_ + step2_ * index, size0_, step1_, size1_);
  }
  ArrayView3D subview(size_t start0, size_t size0,
    size_t start1, size_t size1,
    size_t start2, size_t size2)
  {
    return ArrayView3D(ptr_ + step2_ * start2 + step1_ * start1 + start0,
      size0, step1_, size1, step2_, size2);
  }
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.