powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с матрицей
25 сообщений из 169, страница 6 из 7
Работа с матрицей
    #39962906
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Я переделал на сначала генерацию большого количества маленьких матриц. И теперь замеряю суммирование сразу их всех N раз. Теперь на маленьких матрицах вариант № 1 обгоняет вариант № 2 в 1.2 раза. Это не потому что я пытаюсь письками мерятся, как вы предположили. Я вообще (точнее почти) не думал о производительности когда код писал. Да я и о бенчмарке особо не думал.
В моём тесте оба варианта твои, только второй вариант распараллелен через OpenMP и тест надо собирать с "-fopenmp".
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962909
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят. Сейчас уже трудно собрать осколки сорцов в кучку. Вы можете еще раз их актуализировать.
Где чей последни релиз?
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962917
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, мои можно не смотреть, они явно хуже, чем у petrav и я пока даже не знаю, что в его алгоритме ещё можно оптимизировать. Кажется, он случайно создал самое эффективное решение. :)
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962920
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Кажется, он случайно создал самое эффективное решение. :)

Чисто случайно - это самый лучший паттерн разработки!
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962935
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mayton, мои можно не смотреть, они явно хуже, чем у petrav и я пока даже не знаю, что в его алгоритме ещё можно оптимизировать. Кажется, он случайно создал самое эффективное решение. :)

Ну прямо случайно... лицом по клавиатуре катался и случайно создал. Удача не простое ремесло. Судьба всегда на стороне сильных.

Если по делу и без шуток. Я видел матричную арифметику реализованную и в стиле arr[i][j], и в стиле сдвигания указателей *++ptr. Причём вторая (на сдвиге указателей) побеждала в бенчмарках. Хотя теоретически было совершенно непонятно почему? Логически казалось, что что должно быть наоборот.

Я думаю можно мой алгоритм улучшить.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962937
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, в английском флоте в личном деле офицеров указывают "индекс удачливости".

Вобщем... petrav, ты - фартовый. Тебя можно кидать на нерешаемые проблемы и
ты рандомно постучав по клавиатуре - все порешаешь.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962956
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
...
Я видел матричную арифметику реализованную и в стиле arr[i][j], и в стиле сдвигания указателей *++ptr
...

если нет помех, то ++ptr инлайнится в регистровую операцию.
это невозможно обогнать,
mini.weblab давала же цитату из Кернигана, а ты игнорируешь...
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962975
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobymini.weblab давала же цитату из Кернигана

Вот только у современной интеловской системы команд нет косвенной автоинкрементной
адресации. Та цитата относилась к дековской продукции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в OpenMP версии уменьшить размер матрицы до 1 или до нуля то мы наверное сможем
как-раз увидеть накладные расходы на ::createThread или pthread_create (для linux)
и для джоина их обратно в основной поток.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963002
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

во, страсть какая...
Регистры-то хоть есть какие-нибудь,
чтобы смещение на константу организовать?
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963006
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Я видел матричную арифметику реализованную и в стиле arr[i][j], и в стиле сдвигания указателей *++ptr. Причём вторая (на сдвиге указателей) побеждала в бенчмарках. Хотя теоретически было совершенно непонятно почему? Логически казалось, что что должно быть наоборот.

у Голуба был пример:
# 88. Используйте указатели вместо индексов массива.
Вообще, инкрементирование указателя - лучший способ перемещения по массиву, чем индекс массива. Например, простой цикл, подобный следующему, страшно неэффективен:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct thing
{
    int field;
    int field2;
    int field3;
};

thing array[ nrows ][ ncols ];

int row, col;
for (row = 0;   row < nrows;   ++nrows)
{
    for (col = 0;   col < ncols;   ++cols)
        {array[row][col].field = 0;}
}



Выражение array[row][col] требует двух умножений и одного сложения во время выполнения. Вот что происходит на самом деле:
array + (row * size_of_one_row) + (col * size_of_a_thing)
Каждая структура имеет размер 12 байтов, и 12 не является степенью 2, поэтому вместо умножения нельзя использовать более эффективный сдвиг.

Код: plaintext
1.
2.
3.
4.
5.
// Вы можете сделать то же самое посредством указателей следующим образом:
thing *p = (thing*)array;
int n_cells = nrows * ncols;
while (--n_cells >= 0 )
    {(p++)->field = 0;}



При этом здесь вообще нет умножения во время выполнения. Оператор инкрементирования p++ просто прибавляет 12 к p.
С другой стороны, указатель лучше только тогда, когда вы можете его инкрементировать, то есть когда вы обращаетесь к последовательным элементам.
Если вам нужен по настоящему случайный доступ в массив, то запись с квадратными скобками намного проще читается и разницы в скорости выполнения нет.

Аналогично, если внутренняя часть цикла в принципе неэффективна - скажем, например, мы сделали следующее:
Код: plaintext
1.
2.
3.
4.
for (row = 0;   row < nrows;   ++nrows){
    for (col = 0;   col < ncols;   ++cols)
        {f(array[row][col]);}
}


и f() требует для выполнения две секунды - тогда относительный выигрыш от использования указателей будет существенно перевешен накладными расходами на вызов функции, и, естественно, вы можете утверждать, что квадратные скобки легче читаются. Конечно, если f() является встроенной функцией С++, то накладные расходы на вызов функции могут быть минимальными и есть смысл использовать указатель, поэтому вы можете возразить, что вариант с указателем лучше, ибо накладные расходы тяжело определить.

Наконец, верно, что оптимизатор часто может преобразовать вариант цикла с индексами массива в вариант с указателями, но я думаю, что это плохой стиль - писать неэффективный код в надежде на то, что оптимизатор очистит его после вас. Указатели так же хорошо читаемы, как и индексы массивов, для того, кто знает язык программирования.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963009
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Офтопим мы последнее время сурово. Ну и я добавлю. Как я вижу через 20-ть минут планируется первый запуск SpaceX Crew Dragon с людьми на борту. Ждём прямой трансляции.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963013
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
подозревается мне, что в вопросах нахождения именно суммы (на непрерывном отрезке памяти)
векторизация интересней параллелизации будет.
если уж идти до низа, то ромб интереснее делить на зоны подходящей векторизации, а не параллелить.
Это функция размера ромба, и формирует самостоятельную задачу.
Параллелизацию, если строить, то уже вторым этажом над этим.
Вот такое мне сейчас подумалось.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963032
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ромб смешал все карты. Если-бы можно было свести это к пересечению квадратной матрицы
и единичной-ромбовидной одновременно со сложением через SIMD тогда нам было бы все равно
какая там форма внутри. Бубновая или Трефовая.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963046
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транспонируем матрицу на 45 градусов и ромб превращается в привычный квадрат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963048
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, у меня сильное дежа-вю в плане поворота матрицы на 45 градусов.

Был тут один.. любитель вращать матрицы.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963075
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav, в английском флоте в личном деле офицеров указывают "индекс удачливости".

Вобщем... petrav, ты - фартовый. Тебя можно кидать на нерешаемые проблемы и
ты рандомно постучав по клавиатуре - все порешаешь.

На моей первой работе я ведущему программисту показал сидиром, который я себе купил. Начало 2000-ных. И вот такой разговор:

- Дерьмовый сидиром ты купил. Плохо будет работать. Деньги по-дурацки потратил.
- Но почему? Нормально же выглядит. Я его подключал.
- Не знаю. Но наверное же моё мнение основано на личном опыте?

PS: Работал сидиром хреново. Но это было уже в будущем.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963080
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я когда работал сис.админом в молодости тоже компьютеры лечил взглядом
бывает, жалуется тётка, что комп тупит
подошёл к нему, зыркнул... и уже не тупит
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963087
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, это называется "Эффект присутствия". Звонит юзверь, жалуется, мол, что-то глючит ворд/эксель/пауэрпоинт. Приходишь, просишь воспроизвести проблему - не выходит, всё работает. :) Я вообще толковых пользователей (power users) встречал раз-два и обчёлся.
Помню как-то более 20 лет назад работал на фарм.предприятии. Звонят из лаборатории, говорят, дискету 5,25 из дисковода вытащить не могут. Прихожу, смотрю на системник - никакого дисковода нет, одни заглушки на морде. Спрашиваю - куда же вы дискету вставляли? Отвечают - а вот в щёлочку (между двумя заглушками). Вскрываю корпус а там дискета лежит себе на полочке для устройств.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963091
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, а ещё забавный показательный случай, что не только в России пользователи дундуки. Приехала как-то делегация из пендостанской HQ, прямиком из Коста-Мезы, вопросы порешали, специалисты из делегации разбрелись по разным кабинетам своих российских коллег и вот один такой российский коллега звонит, просит подойти и помочь. Прихожу... Просят засунуть несколько документов на одну дискету 3.5'', а размер документов сильно больше 1.4 Мб. Жму архиватором, запихиваю на дискету, а меня пендосы спрашивают как им потом эти документы выудить. Ити иху мать! Пришлось объяснить на пальцах и записать на бумажке, как использовать консольную утилиту arj.exe.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963098
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы их на 1.7 мб форматировали.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963174
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
rdb_dev
mayton, мои можно не смотреть, они явно хуже, чем у petrav и я пока даже не знаю, что в его алгоритме ещё можно оптимизировать. Кажется, он случайно создал самое эффективное решение. :)
Ну прямо случайно... лицом по клавиатуре катался и случайно создал. Удача не простое ремесло.
Ну, не так грубо , конечно... Я утрирую.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963176
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Мы их на 1.7 мб форматировали.
Да, качество носителей некоторых производителей позволяли. До сих пор ещё с тех времён несколько коробок Verbatim'ов дома на полке пылятся.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963291
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Да, качество носителей некоторых
Некоторых???
Это ничего, что неформатированная ёмкость 3,5-дюймовой дискеты - два мегабайта?

P.S.
Дистрибутив OS/2, если что, поставлялся на дискетах, отформатированных на 1,7МБ. И даже на компакт-диске были образы этих дискет, что позволяло установить OS/2 и на компьютеры без CD.
Достигалось это нестандартным сектором в 1КБ, который уменьшает межсекторные потери и позволяет разместить на дорожке близкий к максимуму объём данных.

P.P.S.
В OS/2 дискеты с нестандартным форматированием читал штатный драйвер. Для записи образов использовалась специальная утилита.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39963443
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, мне, таки, удалось написать алгоритм на указателях по массиву, размерность которого известна только в рантайме, сравнимый по производительности с алгоритмом petrav по массиву, размерность которого известна на стадии компиляции.
Конечно, не обошлось без шаманства с арифметикой указателей.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
template <class T>
class LOG2
{
  static
  constexpr size_t log2of(size_t size)
  {
    return (size > 1) ?(log2of(size >> 1) + 1) :0;
  }

public:
  static constexpr size_t value = LOG2::log2of(sizeof(T));

  static_assert
      (
        (((size_t)1 << LOG2::value) == sizeof(T)),
        "Incompatible size of type"
      );
};

template <class T>
double diamond(const T *matrix, const size_t dim)
{
  constexpr size_t
      element_log2 = LOG2<T>::value,
      element_size = sizeof(T);

  double sum = 0;

  const size_t
      m = dim >> 1,
      row_size = dim << element_log2;

  const char
      *p_upper = (const char*)matrix + (m << element_log2),
      *p_lower = (const char*)matrix + (m << element_log2);

  p_lower += (dim - 1) * row_size;

  for (size_t row_idx = 0; row_idx < m; row_idx++)
  {
    size_t element_shift = row_idx << element_log2;
    for (
          size_t i = 0;
          i < ((element_shift << 1) + element_size);
          i += element_size
        )
    {
      register
      size_t row_shift = row_idx * row_size;
      sum += *(const T*)(p_upper + row_shift - element_shift + i);
      sum += *(const T*)(p_lower - row_shift - element_shift + i);
    }
  }
  auto p = matrix;
  for (size_t i = 0; i < dim; i++) sum += p[i];
  return sum;
}

...
Рейтинг: 0 / 0
25 сообщений из 169, страница 6 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с матрицей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]