powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с матрицей
25 сообщений из 169, страница 5 из 7
Работа с матрицей
    #39962382
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, я же забыл матрицу сделать размера 9. Теперь результаты одинаковые:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Elapsed time: 0.0448235s
Elapsed time: 0.0464368s
Relation: 1.03599
Elapsed time: 0.0466745s
Elapsed time: 0.0470738s
Relation: 1.00855
Elapsed time: 0.045949s
Elapsed time: 0.0463073s
Relation: 1.0078



Я, правда, не уверен, что <chrono> честно считает время. А прикручивать QPC мне лень.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962383
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
кстати, для тестов хорошо подходят единичные матрицы ( а также матрицы со всеми одинаковыми элементами )
думаю что для бенчмарков тоже подойдут

Нет. Не подойдет. Единичную матрицу можно свести к функции которая продуцирует единички или нули
а это сводит на нет все предыдущие достижения по памяти например. Тоесть вы поиграетесь с полиморзимом
но его результаты можно будет натянуть только на единичные матрицы но никак не на общие (real-world matrix).
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962397
mini.weblab
просто для начинающего алгоримы было бы проще начать изучать на Питоне (а не на С или С++)

для начинающего лучше сразу на C++, чтобы понять, как и что работает
кроме того, только на нём ты получаешь ровно тот результат, который ожидаешь
ты точно знаешь, где какой байт за что отвечает
без сюрпризов.
это важно.
нужен только правильный Учитель.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962402
mayton
Сообщения-же компилляции которые выдает С++ - поражают воображение объемом
трафика особнно когда не сматчились паттерны процессора шаблонов

есть такая штука: -Wfatal-errors
оставит 1 строчку
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962405
petrav
mayton
пропущено...

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

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

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

есть такая штука: -Wfatal-errors
оставит 1 строчку

Смысл же не в том чтобы оставить строчку. А в том чтобы месседж об ошибке нес смысл для newcomer-а который
только вчера взялся изучать С++.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962412
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
petrav
пропущено...

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

и у нас есть победитель!

Не завидуй так громко.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962413
mayton
Алексей Роза
пропущено...

есть такая штука: -Wfatal-errors
оставит 1 строчку

Смысл же не в том чтобы оставить строчку. А в том чтобы месседж об ошибке нес смысл для newcomer-а который
только вчера взялся изучать С++.

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

Я только щас добрался до компа. И то не до мощной рабочей станции а до Corei3 ноутбучика.

Из хорошего. Помимо OpenMP есть еще другая библиотечка. Называется OpenACC.
Поддерживается в GCC, и для Clang. И мы ее попробуем для "туза бубей".

Из вопросов. У кого из вас есть учётка в github?
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962582
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По OpenMP, OpenAAC, OpenCL может отдельный топик создать?
Тут как-то цели никакой не поставлено.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962716
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

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

И еще забыл. SIMD. Это конечно уже далеко от С++ но - тоже машинный аспект.

IMHO. Надо попробовать SIMD. Может подойдет а может и нет.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962767
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
}


Давай - еще короче. Два цикла - обычно связанны зависимостью. Если предположить
что они - разряды системы счисления с основанием SIZE.

Заменим циклы на итерацию по всему диапазону двухзначного числа (SIZE,SIZE)
А внутри по сути идет проверка что координата ограничена четырьмя гипер-прямыми под 45 градусов.

Этот алгоритм будет не очень быстрый - зато самый короткий.

У нас в топике два совревнования. В одном два чела выжимают скорость из С++ с ОпенМП.
В другом мы будем сокращать функцию до брейнфака.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962795
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Я, правда, не уверен, что <chrono> честно считает время. А прикручивать QPC мне лень.
К сожалению, если операционная система не предоставляет специальных средств измерения уровня ядра, измерить что-либо точно в третьем кольце не представляется возможным и измерения можно делать только относительные, постаравшись снизить влияние разных факторов.

Добрался до i5 с детерминированным TSC и сделал свой платформозависимый бенчмарк для GNUC'а.

Результат использования OpenMP для маленьких массивов просто катастрофический даже с "прогревом" OpenMP - хуже в тысячу раз!!! Но на массиве размером в гигабайт твой же распараллеленный алгоритм обгоняет однопоточный примерно в 1.3 раза.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DIAMOND_1
SUM: 18016597801181184
Elapsed time(nsec): 52176491.312428

OpenMP warmingup
SUM: 18016597801181184
Elapsed time(nsec): 39681171.870135

DIAMOND_2
SUM: 18016597801181184
Elapsed time(nsec): 34749407.371903
Benchmark
Код: 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.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
#include <windows.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
#include <windows.h>

# ifndef __INLINE
#   ifdef __GNUC__
#     define __INLINE inline __attribute__((always_inline, __target__("default")))
#   endif
# endif

template <typename T>
__INLINE
static
void volatilize(T &r) noexcept
{
  asm volatile ("" : "=m" (r) : "m" (r) :);
}

__INLINE
static
void cpu_pause()
{
  asm volatile ("pause" : : :);
}

__INLINE
static
uint64_t xchg(uint64_t &recv, uint64_t src)
{
  uint64_t register ret;
  asm volatile ("\
      xchg %[ret], %[recv];\n"
    : [ret] "=r" (ret), [recv] "=m" (recv)
    : "0" (src)
    :
  );
  return ret; // old value
}

__INLINE
static
uint64_t tsc_get_ticks() noexcept
{
  register size_t tsc_lo;
  register size_t tsc_hi;
  register size_t tsc_id;
  register uint64_t ret;
  asm volatile ("\
    mov $0, %[tsc_hi];\n\
    mov $0, %[tsc_lo];\n\
    mov $0, %[tsc_id];\n\
    rdtscp;\n"
    : [tsc_lo] "=a" (tsc_lo), [tsc_hi] "=d" (tsc_hi), [tsc_id] "=c" (tsc_id)
    :
    :
  );
  return (tsc_hi << 32) | tsc_lo;
}


struct TSC
{
  uint64_t  value;
  timespec  tmsp;
};

static
double tsc_get_ticks_per_nanosec
    (
      uint32_t pre_delay,
      uint32_t delay,
      TSC *tsc = NULL
    )
{
  alignas(16)
  timespec tmsp_before;
  alignas(8)
  timespec tmsp_after;

  register double ticks_per_nanosec = 0;
  register uint64_t
      ticks_before,
      ticks_after,
      nsec_delta;

  Sleep(pre_delay);
  // -- barrier of insructions
  tsc_get_ticks();
  clock_gettime(CLOCK_REALTIME, &tmsp_before);
  ticks_before = tsc_get_ticks();
  Sleep(delay);
  // -- barrier of instructions
  tsc_get_ticks();
  clock_gettime(CLOCK_REALTIME, &tmsp_after);
  ticks_after = tsc_get_ticks();
  if (NULL != tsc)
  {
    tsc->value = ticks_after;
    tsc->tmsp = tmsp_after;
  }
  if (ticks_after < ticks_before)
    ticks_after += ~(--ticks_before);
  else
    ticks_after -= ticks_before;

  tmsp_after.tv_sec -= tmsp_before.tv_sec;
  tmsp_after.tv_nsec -= tmsp_before.tv_nsec;
  if (0 > tmsp_after.tv_nsec)
  {
    tmsp_after.tv_sec--;
    tmsp_after.tv_nsec += 1000000000L;
  }
  nsec_delta = tmsp_after.tv_sec * 1000000000 + tmsp_after.tv_nsec;
  ticks_per_nanosec = (double)ticks_after / nsec_delta;

  return ticks_per_nanosec;
}

class TSC_ELAPSED
{
  double ticks_per_nsec;
  uint64_t before;
  uint64_t after;

public:
  __INLINE
  TSC_ELAPSED() : before(0), after(0)
  {
    this->ticks_per_nsec = tsc_get_ticks_per_nanosec(16, 7000);
  };

  __INLINE
  void start()
  {
    Sleep(16);
    this->before = tsc_get_ticks();
  }

  __INLINE
  void stop()
  {
    this->after = tsc_get_ticks();
  }

  __INLINE
  double get_ticks_per_nsec()
  {
    return this->ticks_per_nsec;
  }

  __INLINE
  double evaluate_nsec()
  {
    register double ret = 1;
    TSC_ELAPSED & _ = *this;
    if (_.after < _.before)
      ret += _.after + (~_.before);
    else
      ret = _.after - _.before;
    return ret /= _.ticks_per_nsec;
  }
};

constexpr size_t dim = 16384;
//constexpr size_t dim = 5;
typedef int TArr[dim][dim];
static TArr arr;

int64_t diamond1()
{
  const size_t Half = dim / 2;
  int64_t 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[dim-i-1][j];
    }

  for (int i=0; i < dim; ++i)
    res += arr[Half][i];

  return res;
}

int64_t diamond2()
{
  const size_t Half = dim / 2;
  int64_t res = 0;

#pragma omp parallel for reduction (+: res)
  for (size_t i=0; i < Half; ++i)
    for (size_t j = Half-i; j <= Half+i; ++j)
    {
      res += arr[i][j];
      res += arr[dim-i-1][j];
    }

#pragma omp parallel for reduction (+: res)
  for (int i=0; i < dim; ++i)
    res += arr[Half][i];

  return res;
}

int main(int argc, char** argv)
{
  printf("\r\nTSC calibrating, please wait...\r\n");
  TSC_ELAPSED elapsed;
  volatilize(elapsed);
  printf("TSC ticks per nanosec: %lf\r\n", elapsed.get_ticks_per_nsec());

  if (NULL == arr)
    return 1;

  printf("\r\nSize of matrix: %lli\r\n", sizeof(arr));

  constexpr size_t dim_plain = dim * dim;
  int *e = (int*)arr;
  for (size_t i = 0; i < dim_plain; i++) e[i] = i + 1;

  int64_t val;

#pragma omp flush(arr)
  elapsed.start();
  val = diamond1();
  elapsed.stop();
  printf
      (
        "\r\nDIAMOND_1\r\nSUM: %lli\r\nElapsed time(nsec): %lf\r\n",
        val,
        elapsed.evaluate_nsec()
      );

#pragma omp flush(arr)
  elapsed.start();
  val = diamond2();
  elapsed.stop();
  printf
      (
        "\r\nOpenMP warmingup\r\nSUM: %lli\r\nElapsed time(nsec): %lf\r\n",
        val,
        elapsed.evaluate_nsec()
      );

#pragma omp flush(arr)
  elapsed.start();
  volatilize(val);
  val = diamond2();
  elapsed.stop();
  printf
      (
        "\r\nDIAMOND_2\r\nSUM: %lli\r\nElapsed time(nsec): %lf\r\n",
        val,
        elapsed.evaluate_nsec()
      );

  return (EXIT_SUCCESS);
}

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

Давай - еще короче.


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

Давай - еще короче.


это будет нечитабельно и неэффективно.
я потренируюсь лучше бенчмарки делать :)

Хорошо. Потренируйся. Но этот синтетический тест - не особо показателен.
Его эффективность мало зависит от алгоритма а больше предварительного
состояния кешей и количества threads процессора которые в этом участвуют.

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

покa что, функция умножения матриц
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// mtx = mtxa * mtxb

double *matrix_multiplication(double *mtxa, double *mtxb, double *mtx,
		size_t anrow, size_t ancol, size_t bnrow, size_t bncol) {
	int i, j, k;
	double tmpa, tmpb;

	if (ancol != bnrow) {
		return NULL;
	}

	for (i = 0; i < anrow; i++) {
		for (j=0; j< bncol; j++) {
			*(mtx + i * bncol + j) = 0;
			for (k = 0; k < ancol; k++) {
				tmpa = *(mtxa + i * ancol + k);
				tmpb = *(mtxb + k * bncol + j);
				*(mtx + i * bncol + j) += tmpa * tmpb;
			}
		}
	}
	return mtx;
}



по матрицам в С:
мне бы хотелось работать с элементами матрицы, типа mtx[ i ][ j ], но не я понимаю как это сделать, и можно ли это вообще сделать.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962846
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
petrav
Я, правда, не уверен, что <chrono> честно считает время. А прикручивать QPC мне лень.
К сожалению, если операционная система не предоставляет специальных средств измерения уровня ядра, измерить что-либо точно в третьем кольце не представляется возможным и измерения можно делать только относительные, постаравшись снизить влияние разных факторов.

Ваши слова натолкнули меня на мысль, что я вообще по-дибильному время считаю. Я генерирую маленькую матрицу, подсчитываю время одного вызова функции и так в цикле суммирую. Время, понятно, крайне маленькое. И библиотека <chrono> не справляется. По сути я суммирую некие минимально доступные кванты времени.

Я переделал на сначала генерацию большого количества маленьких матриц. И теперь замеряю суммирование сразу их всех N раз. Теперь на маленьких матрицах вариант № 1 обгоняет вариант № 2 в 1.2 раза. Это не потому что я пытаюсь письками мерятся, как вы предположили. Я вообще (точнее почти) не думал о производительности когда код писал. Да я и о бенчмарке особо не думал.

rdb_dev
Добрался до i5 с детерминированным TSC и сделал свой платформозависимый бенчмарк для GNUC'а.

Ну WinAPI QPC вроде как тоже возвращает значение некоего аппаратного счётчика. MS пишет про точность 10 -6 сек.

rdb_dev
Результат использования OpenMP для маленьких массивов просто катастрофический даже с "прогревом" OpenMP - хуже в тысячу раз!!!

Прикольно.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное OpenMP на старт-стоп потоков тратит накладные расходы. Их в коде не видно
но они-же где-то стоят.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962865
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, про "прогрев" я упомянул, но дело даже не в этом. Просто получается очень маленькая "зернистость" и скорость выполнения каждого зерна выше, чем скорость синхронизации результатов через барьеры и атомарные функции (по крайней мере на том компе, где я тестировал, так как реальная скорость зависит от скорости шины памяти или от скорости FSB на предыдущих поколениях процессоров). Соответственно, реальный выигрыш получается только на очень больших массивах - свыше 1 Гб, но такие массивы пихать целиком в адресное пространство процесса как-то некомильфо.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962867
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Их в коде не видно
но они-же где-то стоят.
Очевидно, в "libgomp-1.dll", которая болтается в таблице импорта исполняемого файла.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-ж про это писал. Настоящую мощь этих оптимизаций можно почувствовать только на больших данных.

Какой смысл др04ить параллелизм когда 5х5 целых чисел сложатья быстрее чем мы подготовим
потоки и диспетчер их успеет форкнуть и менеджер ОС успеет их разложить по ядрам и
они в ядрах успеют получить в L1 нужный им срез матрицы.

Этож не зелёные мать их потоки как в Java. И не корутины. Это реальные потоки операционки.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962874
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, это понятно, но я не ожидал таких огромных накладных расходов, увеличивающих время выполнения более чем в тысячу раз.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962889
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати - в тему Java - самый убойный вопрос на собеседовании - как сделать kill для JavaThread.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962896
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём, собственно, проблема?
Регулярно проверяем состояние прерывания и, при необходимости, выходим, делая нужную очистку.
Насколько я понимаю, оно везде так, не только в Java.
...
Рейтинг: 0 / 0
Работа с матрицей
    #39962903
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы можете вежливо (gracefully) попросить поток завершиться. И он завершиться.
Если такая возможность была заложена.
...
Рейтинг: 0 / 0
25 сообщений из 169, страница 5 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа с матрицей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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