powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с матрицей
25 сообщений из 169, страница 4 из 7
Работа с матрицей
    #39962152
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustSomethingа кто сказал что не хочу и не буду?

Весь топик об этом. Собственных попыток - ноль.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962158
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
JustSomething,
переходите на Питон! будет проще! :-)
Питон для слабаков! :)


Модератор: Под спойлер
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962161
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно что Python-разработчик как таковой - редок в вакансиях.

Его часто подмешивают к таким хеш-тегам как data-engineer, data-scientist, devops.

+Еще часто его можно видеть как необходимый в машинном обучении.

Тоесть он необходим как bash, но о нем не говорят как о независимом языке.
Скорее как о слое который управляет более низким слоем написанном уже на этих
ваших CUDA-х, OpenCV-ах.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962177
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не призываю никого становиться Питон-разработчиком :)
просто для начинающего алгоримы было бы проще начать изучать на Питоне (а не на С или С++)
в данном случае я за divide and conquer :)
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962190
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, проще всего начинать с Intel x86 ассемблера под flat модель, если преподам показать правильный подход к его изучению. После чего учащийся сможет легко и непринуждённо самостоятельно осваивать любые языки.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devпроще всего начинать с Intel x86 ассемблера под flat модель

Замороченный всё же у интеля ассемблер. DEC PDP-11 попроще будет и на Си хорошо проецируется.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962213
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, можно даже VAX или MIPS, что интереснее, полезнее и денежнее. Главное - показать чем и как, в конечном итоге, оперирует АЛУ.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962296
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
я не призываю никого становиться Питон-разработчиком :)
просто для начинающего алгоримы было бы проще начать изучать на Питоне (а не на С или С++)
в данном случае я за divide and conquer :)

Дидактические свойства Питона - под большим сомнением.

Мне кажется что единственный полезный язык для обучения новичков - это Pascal.
В нем соблюден баланс информативной полезности сообщений об ошибках в случае
если таковые есть. Грубо говоря новичок сравнительно легко читает их и фиксит.
В этом плане Никлаус Вирт - молодец хотя и зануда.

Сообщения-же компилляции которые выдает С++ - поражают воображение объемом
трафика особнно когда не сматчились паттерны процессора шаблонов, или
ошибки линкера (смотрим топик где бедный Петро пытается победить
Visual Studio и при том он - не новичек). Тоесть такой подход в обучении обречен
сразу на провал и на демотивацию если нет учителя который в состоянии прочитать
и прокомментировать эту техническую лабуду. И не дай бох это рантайм где
мы видим ошибку как дамп памяти + содержимое регистров процессора (ага) посчитайте
какой объем знаний уже тут нужен чтоб разобраться. Это к С++ надо еще и учебник
Юрова читать про Ассемблер.

Тоесть в учебном смысла С++ - непригоден если вы нуб и решили его учить самостоятельно.
Демотивация гарантирована особенно на фоне C# к примеру.

Щас еще крупно-корпорации открывают курсы для детей где обучают их Scratci но
я этот язык пока не видел и ничего не могу сказать.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962305
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, сделал как ты хотел!
Не желаешь потестить производительность на больших массивах? :)
Код: 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.
int64_t diamond(const int *matrix, const size_t dim)
{
  int64_t sum = 0;

  const size_t m = dim >> 1;
  auto const middl_row = matrix + dim * m;

#pragma omp parallel reduction(+: sum)
  {
  #pragma omp for
    for (size_t row_idx = 0; row_idx < m; row_idx++)
    {
      register size_t tmp = row_idx << 1;

      const size_t
          cnt_upper = tmp + 1,
          cnt_lower = dim - tmp;

      tmp = dim * row_idx;

      auto
          *p_upper = matrix + tmp + m - row_idx,
          *p_lower = middl_row + tmp + row_idx;

    #pragma omp parallel reduction (+: sum)
      {
      #pragma omp for
        for (auto *p = p_upper; p < p_upper + cnt_upper; p++)
          sum += *p;

      #pragma omp for
        for (auto *p = p_lower; p < p_lower + cnt_lower; p++)
          sum += *p;
      } // #pragma omp parallel reduction(+: sum)
    }
  } // #pragma omp parallel reduction(+: sum)
  sum += *(matrix + dim * (dim - 1) + m);
  return sum;
}

Собирать надо с опцией -fopenmp
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962309
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

дружище я протещу только вечером. Доберусь до своей линукс машинки где у меня и железо хорошее. И clang
установлен.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962311
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тоже свою версию написала (С) :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
long long diamondsum(int *mtx, size_t n) {
	long long sum = 0;
	size_t m = n >> 1 ;
	size_t i, j;

	for (i = 0; i < n; i++) {
		for (j = abs(m - i); j < n - abs(m - i)  ; j++){
			sum += *(mtx + i * n + j);
		}
	}
	return sum;
}

...
Рейтинг: 0 / 0
Работа с матрицей
    #39962312
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mayton, сделал как ты хотел!
Собирать надо с опцией -fopenmp

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

На маленьких матрицах ваш OpenMP тормознёт алгоритм разов в 10-ть.

Ну а вы вообще... писать страшные алгоритмы один за одним вам не лень, подставить их в бенчмарк вам лень. Типа я должен сделать.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962315
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне кажется что единственный полезный язык для обучения новичков - это Pascal.

Лично я начинал на ДВК-1 с Бейсика и машинных кодов, так что считаю эту связку
оптимальной. Первый даёт языковые навыки для всех директивных языков и при этом достаточно
беден чтобы руководство (список операторов) уместилось на один листок, второй - понимание
как работает компьютер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962316
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сейчас тоже попробую бенчмарки делать, но не знаю получится или нет :)
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962318
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, забыл добавить, что нужно ещё заинклюдить <omp.h>
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962321
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
На маленьких матрицах ваш OpenMP тормознёт алгоритм разов в 10-ть.
У тебя есть возможность проверить сие утверждение. ;) Тормознуть, конечно, может, особенно на очень многоядерных/многопроцессорных компах, да ещё и с несколькими NUMA узлами, но сомневаюсь, что так сильно - в 10 раз.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962327
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Ну а вы вообще... писать страшные алгоритмы один за одним вам не лень, подставить их в бенчмарк вам лень. Типа я должен сделать.
У меня старый комп 2008 года на Q9550 с недетерминированным TSC.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962328
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav
На маленьких матрицах ваш OpenMP тормознёт алгоритм разов в 10-ть.
У тебя есть возможность проверить сие утверждение. ;) Тормознуть, конечно, может, особенно на очень многоядерных/многопроцессорных компах, да ещё и с несколькими NUMA узлами, но сомневаюсь, что так сильно - в 10 раз.

Я уже проверял много лет назад с перемножением маленьких матриц с использованием OpenMP. Результаты были плачевные, ожидаемо, один только барьер памяти тебе снесёт все надежды на производительность.

А у тебя нет возможности проверить? Как написать так возможность есть, как проверить так нет возможности. Зачем тогда писать. Короче ждём бенчмарк на маленьких матрицах.

Например, 9. Размерность мира в котором мы двигаемся — 3, а не миллион.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962340
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonМне кажется что единственный полезный язык для обучения новичков - это Pascal.

Лично я начинал на ДВК-1 с Бейсика и машинных кодов, так что считаю эту связку
оптимальной. Первый даёт языковые навыки для всех директивных языков и при этом достаточно
беден чтобы руководство (список операторов) уместилось на один листок, второй - понимание
как работает компьютер.

Мой первый язык это был Бейсик для Электроника БК 10. И первый софт я не написал
а содрал с книжки 1 в 1. Вот такое было обучение.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962347
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Dimitry Sibiryakov

пропущено...

Лично я начинал на ДВК-1 с Бейсика и машинных кодов, так что считаю эту связку
оптимальной. Первый даёт языковые навыки для всех директивных языков и при этом достаточно
беден чтобы руководство (список операторов) уместилось на один листок, второй - понимание
как работает компьютер.

Мой первый язык это был Бейсик для Электроника БК 10. И первый софт я не написал
а содрал с книжки 1 в 1. Вот такое было обучение.

Это не круто. Программируемый калькулятор МК-52 круче, ассемблер и машинный код. Я на нём программировал даже в поезде на втором "этаже". А ещё мама приносила из института перфокарты и я умел их расшифровывать. Но первый софт я написал на советском лунаходе .
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962352
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
rdb_dev
mayton, сделал как ты хотел!
Собирать надо с опцией -fopenmp

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

На маленьких матрицах ваш OpenMP тормознёт алгоритм разов в 10-ть.

Давай порассуждаем. У этой задачи есть 2 аспекта. Первый - это оценка асимптоматики. Она - квадратичная по size - матрицы.
Что-бы мы не придумывали. Какие - бы хитровыеб.... умные способы мы не избирали - все одно сведем к перебору всех
чисел "бубнового туза".

Второй аспект - чисто машиный. Это

- игры с указателями. Оптимальная арифметика инкрементов где мы должны
вообще уйти от операций умножения и свести их к алгоритмам наподобие Брезенхема.

- Игры с кешами L1/L2/L3. И padding с целю попадания в кеш-линию.
Есть творческая задачка где умножаются 2 большие матрицы. Кстати вторая - транспонируется предварительно
(угадай зачем). И в зависимости от кластеризации данных (близко они лежат или далеко в памяти) мы
можем получать в разы отличающееся характеристики. А поскольку эта задача идеально
ложиться в map-reduce - то мы можем этот ромбик как торт резать на трапеции так как
будет выгодно Threads процессора или разложить данные в 2 канала памяти. Или предварительно
прогрев кеши нужными данными очень быстро дернуть сложение и таким образом "нае6аtь"
потенциального заказчика показав ему сферическое сложение в вакууме. Ведь время
загрузки матрицы с диска мы не учли. А хардкодные цифры никому не интересны.

- Игры с разрядностью. С компиллятором. С железом.

Все части машинного аспекта - выгодно тестировать на больших объемах оперативки. На малых - непонятно
что мы тестируем. Ведь ты должен динамически генерить новые матрицы для каждого вызова.
Ты-же думал об этом? Верно?

Ну а вы вообще... писать страшные алгоритмы один за одним вам не лень, подставить их в бенчмарк вам лень. Типа я должен сделать.
Какой ты... нетерпеливый.

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

Мой первый язык это был Бейсик для Электроника БК 10. И первый софт я не написал
а содрал с книжки 1 в 1. Вот такое было обучение.

Это не круто. Программируемый калькулятор МК-52 круче, ассемблер и машинный код. Я на нём программировал даже в поезде на втором "этаже". А ещё мама приносила из института перфокарты и я умел их расшифровывать. Но первый софт я написал на советском лунаходе .

Я помню его. (Калькулятор). Я решал кубическое уравнение исопльзуя только стек. Из 4х ячеек.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962368
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Кстати вторая - транспонируется предварительно (угадай зачем).

Не вижу зачем заранее транспонировать матрицу если нам нужна транспонировання матрица. Ведь можно написать спец. функцию где индексы i и j будут просто поменяны местами.

mayton
Все части машинного аспекта - выгодно тестировать на больших объемах оперативки. На малых - непонятно
что мы тестируем.

Мы тестируем то что нам нужно по прикладной задаче. У нас размерность мира 3, а не 1000000.

mayton
Ведь ты должен динамически генерить новые матрицы для каждого вызова.
Ты-же думал об этом? Верно?

Ну я доработал бенчмарк до генерации массива для каждого вызова. Теперь в 64-бит отставание в 1.8 раз.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Elapsed time: 0.170488s
Elapsed time: 0.299534s
Relation: 1.75692
Elapsed time: 0.293203s
Elapsed time: 0.168493s
Relation: 0.574663
Elapsed time: 0.167437s
Elapsed time: 0.299641s
Relation: 1.78957


Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
#include <chrono>

#if 1
using Type = int;
#else
using Type = double;
#endif

int const Size = 1024+1/*5*/;
int const Half = Size / 2;

Type arr[Size][Size] =
{
     1,  2,  3,  4,  5,
     6,  7,  8,  9, 11,
    12, 14, 15, 16, 17,
    18, 19, 20, 21, 22,
    23, 24, 25, 26, 27
};

Type summ_diamond_1()
{
    Type res = 0;

    for (size_t i=0; i<Half; ++i)
    {
        for (size_t j=Half-i; j<=Half+i; ++j)
        {
            res += arr[i][j];
            res += arr[Size-i-1][j];
        }
    }

    for (size_t i=0; i<Size; ++i)
    {
        res += arr[Half][i];
    }

    return res;
}

Type summ_diamond_2()
{
  constexpr size_t dim = Size;
  constexpr size_t m = dim / 2;

  Type sum = 0;
  Type
      *head = ((Type*)arr) + m,
      *tail = ((Type*)arr) + dim*dim - m - 1;
  size_t
      n = 1,
      c = n,
      d;

  while (head != tail)
  {
    if (c--)
    {
      sum += *head++;
      sum += *tail--;
    }
    else
    {
      d = dim - 1 - n;
      head += d;
      tail -= d;
      n += 2;
      c = n;
    }
  }
  sum += *head;

  return sum;
}

double test(Type (&summ_func)())
{
    double res = 0.0;
    for (size_t i=0; i<1000; ++i)
    {
        for (size_t i=0; i<Size; ++i)
        {
            for (size_t j=0; j<Size; ++j)
            {
                arr[i][j] = std::rand();
            }
        }

        auto start = std::chrono::high_resolution_clock::now();
        summ_func();
        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed_seconds = end - start;
        res += elapsed_seconds.count();
    }
    std::cout << "Elapsed time: " << res << "s\n";
    return res;
}

void testComplex(Type (&summ_func_1)(), Type (&summ_func_2)())
{
    double const d1 = test(summ_func_1);
    double const d2 = test(summ_func_2);
    std::cout << "Relation: " << (d2 / d1) << "\n";
}

void calc_times()
{
    testComplex(summ_diamond_1, summ_diamond_2);
    testComplex(summ_diamond_2, summ_diamond_1);
    testComplex(summ_diamond_1, summ_diamond_2);
}


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

Не вижу зачем заранее транспонировать матрицу если нам нужна транспонировання матрица. Ведь можно написать спец. функцию где индексы i и j будут просто поменяны местами.

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


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