powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с матрицей
25 сообщений из 169, страница 3 из 7
Работа с матрицей
    #39961815
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, а теперь в calc_times поменяй вызовы diamond1 с diamond2 и проверь ещё разок.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961817
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ты серьезно?

Кто же тестит на такой мелкой матрице.

Виноват, не додумал. Увеличил матрицу до 129*129, заполнил std::rand(). Теперь мой код обгоняет в три раза.
Код: plaintext
1.
2.
3.
Elapsed time: 2.40027s
Elapsed time: 7.26546s
Relation: 3.02694
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961822
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav, а теперь в calc_times поменяй вызовы diamond1 с diamond2 и проверь ещё разок.

Код: plaintext
1.
2.
3.
Elapsed time: 7.32503s
Elapsed time: 2.36428s
Relation: 0.322767
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961824
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, вполне возможно и именно в 3 раза при использовании 32 разрядного приложения и в 7 раз при использовании 64 разрядного. Проблема производительности в доступе по декрементному указателю.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961826
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustSomething
petrav

Заметили? Задачу решил я, а благодарность всем. Вот и помогай людям после такого.


Вам выражаю особую благодарность)

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

Код: plaintext
1.
2.
3.
4.
    if (c--)
    {
      sum += *head++;
      sum += *tail--;
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961833
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mayton
По поводу реализации rdb_dev - она - хорошая. Мне нравится, но для трансформаци по Степанову - не подходит.

Она хорошая только в условиях однопоточности.

На данный момент средствами объективного контроля я наблюдаю, что твоя реализация плохая во всех смыслах. Без обид. Она не читаемая, сложная, запутанная и плохо оптимизируемая. Попробуй обгони мой код. Думаю это возможно.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961836
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и возьмите матрицу хотя-бы в миллион.

И еще petrav. Чтобы тест был честным ты должен запускать в шахматном порядке
обе функции несколько раз и брать среднее время в финале. Это важно потому-то
первая-функция -первопроходец может наблюдать картину кешей L1/L2/L3 отличную
от второго запуска.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961839
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И выровняйте ширину матрицы по кеш-линии.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961843
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Да и возьмите матрицу хотя-бы в миллион.

И еще petrav. Чтобы тест был честным ты должен запускать в шахматном порядке
обе функции несколько раз и брать среднее время в финале. Это важно потому-то
первая-функция -первопроходец может наблюдать картину кешей L1/L2/L3 отличную
от второго запуска.

Взял 1024+1*1024+1. Миллион же? Ситуация ещё более усугубилась. Теперь не три, а 3.5 раза отставание.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Elapsed time: 12.7407s
Elapsed time: 45.222s
Relation: 3.54941
Elapsed time: 45.2662s
Elapsed time: 12.7202s
Relation: 0.281008
Elapsed time: 12.7821s
Elapsed time: 45.2582s
Relation: 3.54074



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
void calc_times()
{
    for (size_t i=0; i<Size; ++i)
    {
        for (size_t j=0; j<Size; ++j)
        {
            arr[i][j] = std::rand();
        }
    }

    double const d1_1 = test(summ_diamond_1);
    double const d2_1 = test(summ_diamond_2);
    std::cout << "Relation: " << (d2_1 / d1_1) << "\n";

    double const d1_2 = test(summ_diamond_2);
    double const d2_2 = test(summ_diamond_1);
    std::cout << "Relation: " << (d2_2 / d1_2) << "\n";

    double const d1_3 = test(summ_diamond_1);
    double const d2_3 = test(summ_diamond_2);
    std::cout << "Relation: " << (d2_3 / d1_3) << "\n";
}
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961848
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Показывай сорцы.

И вообще. Ты пользуешся GitHut или BitBucket?
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961850
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Показывай сорцы.

И вообще. Ты пользуешся GitHut или BitBucket?

Нет. Показываю.


Код: 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.
#include <chrono>

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

int 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
};

int summ_diamond_1()
{
    int res = 0;

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

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

    return res;
}

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

  int sum = 0;
  int
      *head = ((int*)arr) + m,
      *tail = ((int*)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(int (&summ_func)())
{
    auto start = std::chrono::high_resolution_clock::now();
    for (size_t i=0; i<100000; ++i)
    {
        int const res = summ_func();
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed_seconds = end - start;
    double const res = elapsed_seconds.count();
    std::cout << "Elapsed time: " << res << "s\n";
    return res;
}

void calc_times()
{
    for (size_t i=0; i<Size; ++i)
    {
        for (size_t j=0; j<Size; ++j)
        {
            arr[i][j] = std::rand();
        }
    }

    double const d1_1 = test(summ_diamond_1);
    double const d2_1 = test(summ_diamond_2);
    std::cout << "Relation: " << (d2_1 / d1_1) << "\n";

    double const d1_2 = test(summ_diamond_2);
    double const d2_2 = test(summ_diamond_1);
    std::cout << "Relation: " << (d2_2 / d1_2) << "\n";

    double const d1_3 = test(summ_diamond_1);
    double const d2_3 = test(summ_diamond_2);
    std::cout << "Relation: " << (d2_3 / d1_3) << "\n";
}


...
Рейтинг: 0 / 0
Работа с матрицей
    #39961855
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
И выровняйте ширину матрицы по кеш-линии.

В смысле? Выравнивание по умолчанию. 32-ва бита.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961856
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
И выровняйте ширину матрицы по кеш-линии.

В смысле? Выравнивание по умолчанию. 32-ва бита.

Ну х*евое выравнивание. Кеш-линия - 64 байта. Вот посчитай.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и надо чтоб господин rdb_dev пофиксил свой реверсный итератор.

А я - сорян ребята. Я очень хочу тут с вами покомпилировать. Но у меня щас prod-дефект.
Так что я удаляюсь пока.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961861
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav
пропущено...

В смысле? Выравнивание по умолчанию. 32-ва бита.

Ну х*евое выравнивание. Кеш-линия - 64 байта. Вот посчитай.

Ну я переключился на Релиз 64. Ситуация улучшилась. Теперь отставание в 2.2:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Elapsed time: 13.1537s
Elapsed time: 28.4684s
Relation: 2.16428
Elapsed time: 28.3625s
Elapsed time: 13.0515s
Relation: 0.460167
Elapsed time: 12.9651s
Elapsed time: 28.6319s
Relation: 2.20839
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961879
JustSomething
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, и снова у меня появились вопросы. Перейдя от теоретической части к практической, и скомпилировав данный код от уважаемого petrav
petrav
Решение двух пунктов сразу.

получила следующее:

....
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/x86_64-linux-gnu-ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

Пошарившись в интернетах, нашла такое:

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

int main()
{
// TODO: implementation
}


Хотела уточнить, это дело в компиляторе или мне действительно нужно добавить ф-цию main?
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961880
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustSomething

Хотела уточнить, это дело в компиляторе или мне действительно нужно добавить ф-цию main?

Ну вообще да, main() желательна. Напишите хотя бы так:

Код: plaintext
1.
2.
void main()
{}


А оттуда уже всё вызывайте. Но лучше, конечно, прочитать Кернигана и Ритчи. Всего-то 300 страниц.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961922
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustSomething,
переходите на Питон! будет проще! :-)
это же тройной вынос мозга получается -> матрицы + (что-то с ними сделать) + С/С++!
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961941
JustSomething
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mini.weblab, Вы знаете, я бы может и перешла, кто знает, что больше понравится, но вот эти странные люди как научные руководители говорят писать курсовую на плюсах ну и вот что ты будешь с этим делать?)
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961944
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustSomethingвот что ты будешь с этим делать?

Прямо заявить им в наглые глаза, что "я вообще программировать не умею, не хочу и не буду,
отвалите".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961945
JustSomething
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, так а кто сказал что не хочу и не буду? Не припоминаю что-то чтоб говорила такое)
То, что не совсем хорошо получается, это да, не спорю, но это ведь не значит, что на этом конец)
Добра Вам и позитива!
...
Рейтинг: 0 / 0
Работа с матрицей
    #39961957
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по мотивам,
а можно ли транспозицию матрицы сделать через указатели?
т.е. мы не трогаем матрицу, а переставляем указатели на элементы матрицы нужным нам образом?
примерно так
Код: 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.
#include <stdio.h>

int main() {
	int mtx[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };

	// Create a matrix of pointers: each pointer contains an address of the corresponding matrix element
	int *pt[3][3];

	// We apply transposition on the matrix of pointers, and the initial matrix is left unchanged
	for (int i=0; i<3; i++) {
		for (int j=0; j<3; j++){
			pt[i][j] = mtx[j] + i;
		}
	}

	// Print the matrix mtx
	for (int i=0; i<3; i++) {
		for (int j=0; j<3; j++) {
			printf("%d ", mtx[i][j]);
		}
		printf("\n");
	}

	// Print the transposed matrix mtx using transposed pointer matrix
	for (int i=0; i<3; i++) {
		for (int j=0; j<3; j++) {
			printf("%d ", *pt[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962060
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транспозиция это транспонирование?
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962072
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
На данный момент средствами объективного контроля я наблюдаю, что твоя реализация плохая во всех смыслах. Без обид. Она не читаемая, сложная, запутанная и плохо оптимизируемая. Попробуй обгони мой код. Думаю это возможно.
Дружище, во-первых, я не ставил перед собой задачу сделать быстрый и эффективный алгоритм, а во вторых, я давно вышел из того возраста, когда делают засечки на столешнице, меряясь "гордостью" (я тебе об этом намекнул 22139187 , но ты не догнал ;) ). Тем не менее, вызов принят.
Сравни с этим алгоритмом, мне самому лень
Код: 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.
int64_t diamond(int *matrix, size_t dim)
{
  int64_t sum = 0;

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

  register size_t tmp;

  size_t
      cnt_frst,
      cnt_scnd;

  int
      *p_frst,
      *p_scnd;

  for (size_t row_idx = 0; row_idx < m; row_idx++)
  {
    tmp = (row_idx << 1);
    cnt_frst = tmp + 1;
    cnt_scnd = dim - tmp;

    tmp = dim * row_idx;
    p_frst = matrix + tmp + m - row_idx;
    p_scnd = middl_row + tmp + row_idx;

    //do sum += *p_frst++; while (--cnt_frst);
    for (auto *p = p_frst; p < p_frst + cnt_frst; p++)
      sum += *p;

    //do sum += *p_scnd++; while (--cnt_scnd);
    for (auto *p = p_scnd; p < p_scnd + cnt_scnd; p++)
      sum += *p;
  }
  sum += *(matrix + dim * (dim - 1) + m);
  return sum;
}

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


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