Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 35 36 37 38 39 40 41 42 [43] 44   вперед  Ctrl
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Добавил статистику для Node.JS, Golang, Java.
19 фев 19, 03:06    [21813857]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Up.

Необходимо смигрировать на Docker. Это упростит конфигурацию.
19 апр 19, 22:00    [21867548]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Потестил однопоточный java-вариант на JRE-11 с EpsilonGC.
Работает только с Xmx больше 4 гігабайт с копейками.

%JAVA_HOME%\bin\java -version

echo "%DATE% %TIME%"

%JAVA_HOME%\bin\java ^
 -XX:+UnlockExperimentalVMOptions ^
 -XX:+UseEpsilonGC ^
 -Xmx5G ^
 -cp . ^
 CardRaytracer 1.ppm


Кто невкурсе - просто подскажу что EpsilogGC - это отсуствие GC. Вот такой вот забавный fuck факт.

java version "11.0.3" 2019-04-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.3+12-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.3+12-LTS, mixed mode)

Elapsed time : 19 sec
23 май 19, 14:00    [21891913]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Джентльмены. А почему мы похоронили Groovy-бенчмарк? Он вообще рабочий?
11 авг 19, 22:29    [21946681]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
https://github.com/Mark-Kovalyov/CardRaytracerBenchmark/tree/master/experimental/groovy
12 авг 19, 10:24    [21946853]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Прошу прощения за внезапный UP.

В топик призывается Зяма и все другие.

Обновил цифры по Rust/Clang.

Обновилась версия ПО Rust/Cargo в связи с чем часть зависимостей устарела и перестала собираться.

Я не могу объяснить такой обгон. Разве что Rust научился более грамотно делать подготовку
кода для виртуальной машины LLVM с учотом возможной будущей нагрузки.

Нужно больше минералов тестов чтобы выяснить что это за аномалия.

Смотрите картинку.

Тестируйте на своём железе.

К сообщению приложен файл. Размер - 148Kb
15 фев 20, 22:32    [22080587]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
С++ еще не обновлял. Но обновлю в ближайшее время. Впрочем пища для размышления уже есть.
15 фев 20, 22:35    [22080590]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1350
а что делает ".clang.exe"
на линухе?
16 фев 20, 03:08    [22080642]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Просто так назвали бинарник.
16 фев 20, 10:16    [22080659]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Щас обновлю репорт по С++. Скрипт был сломан. Пофиксил.

Новая статистика с учотом обновлений clang/gcc.

Language/Type; Options ; Elapsed time
C++/Canonical ; -O3 -march=native ; 10.37 s
C++/Opt ;       -O3 -march=native ; 10.03 s
C++/RWolf ;     -O3 -march=native ; 9.06 s
Clang++/Canonical ; -O3 -march=native ; 10.67 s
Clang++/Opt ;       -O3 -march=native ; 12.97 s
Clang++/RWolf ;     -O3 -march=native ; 13.32 s

В Гите я выложу более красивую табличку. С авторами. Каноническая версия - Пол Гекберт.
RWolf - кто такой? ХЗ. Ладно пускай будет в колонке с автором. Адаптацию класса Opt кажется
делал Илья но я не уверен. Кто-то подтвердите плиз. В git-blame авторство не зафиксировалось.
16 фев 20, 12:05    [22080684]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Теперь С++ сильно вровень идёт с AVX2 оптимизацией которую долго делал Зяма.
16 фев 20, 12:33    [22080692]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 16071
mayton
RWolf - кто такой?

Был такой участник RWolf
16 фев 20, 12:59    [22080702]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Обновил статистику по GO.

Очень хорошо поднялся. Почти в 2 раза. Теперь стоит где-то между Dlang и Node.JS.
Странно что при этом версия компиллятора не менялась. Что они там?
В снапшотах что-ли изменения делают?

К сообщению приложен файл. Размер - 130Kb
29 фев 20, 13:22    [22089705]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Обновил цифры по FreePascal.

Я понял. Моя вина. Все отчоты где стоит тег non up to date - относятся к моему старому железу на базе Core-i3
и не актуальны в сравнении. Поэтому в них пока не смотрите.

+Добавил подробную информацию о железе где это тестировалось. Тип процессора точно-точно указан.
29 фев 20, 14:33    [22089725]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Up. Есть updates по node/Python

я
Хм... обновил NodeJS до v10.19.0. Результаты улучшились. Но есть артефакты.

Впервые я не могу интерпретировать результат. Получаю двух-модовое распределение времени.
Один центр колеблется возле 27 секунд. Другой - возле 40. Это может быть связано с особенностями
STDOUT для процесса Node, но тут надо чье-то мнение кто этой нодой занимается.
25 авг 20, 08:30    [22186703]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2466
mayton,

Данные по C# насколько актуальны? Что-то там всё печально.

Код ноды делает new и каждый раз выполняется функция конструктора со всеми методами, можно вынести в прототип то, что не меняется, возможно еще немного ускорится код. Еще бенч считает всё вместе с запуском вм и компиляцией, когда для явы считается только время работы. С другой стороны результат такой, какой примерно и должен быть - в 3 раза медленнее си.

Сообщение было отредактировано: 25 авг 20, 09:44
25 авг 20, 09:42    [22186716]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
crutchmaster
mayton,

Данные по C# насколько актуальны? Что-то там всё печально.

Код ноды делает new и каждый раз выполняется функция конструктора со всеми методами, можно вынести в прототип то, что не меняется, возможно еще немного ускорится код. С другой стороны результат такой, какой примерно и должен быть - в 3 раза медленнее си.

Я в тот момент уже плотно сидел на линуксах и поэтому шарпом занимался Дима. Он писал код и запускал бенчмарки.

Я не против актуализации. Но тесты надо делать на едином железе сразу для всего. Поэтому вы можете на своём железе
прогнать все тесты и я прикреплю ваш отчот со ссылкой на его специфику.

По поводу изменений к Node.JS. Я не против. Репозитарий - публичный. Предлагайте ваш merge request.
25 авг 20, 09:49    [22186719]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 16071
crutchmaster
mayton,

Данные по C# насколько актуальны? Что-то там всё печально.

Код ноды делает new и каждый раз выполняется функция конструктора со всеми методами, можно вынести в прототип то, что не меняется, возможно еще немного ускорится код. Еще бенч считает всё вместе с запуском вм и компиляцией, когда для явы считается только время работы. С другой стороны результат такой, какой примерно и должен быть - в 3 раза медленнее си.

Не в 3, а в полтора раза медленнее, 21541279 см. строку "c# .net core 2.1"
В 3 раза медленнее работает под mono, когда начинали запустить C# в линуксе можно было только под mono.

По поводу new - можешь пооптимизировать, я особо не вникал в логику, в основе кода исходник на С++. Как вариант для начала просто отключить сборку мусора и посмотреть что это даст.

Замеряется время работы откомпилированного кода.

PS .net core уже 3.1, как обычно MS все переломал в новой версии, попробовал запустить - не работает, поразбираюсь как-нибудь на досуге.

Сообщение было отредактировано: 25 авг 20, 13:09
25 авг 20, 13:12    [22186866]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
На Java 11 отключение уборки мусора никакого особого эффекта не дает. За 12 секунд работы
приложение флудит но не настолько чтоб сработал первый триггер уборщика.

Там есть более сложные проблемы типа just-in-time компиллятора который успевает в этот
интервал включиться и начать на ходу пересобирать горячие методы и это оказывает
более сильный эффект.
25 авг 20, 13:20    [22186873]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Спасибо Зяма. Подкинул реализацию Delphi. Еще не смотрел.

program card_raytracer10;

// Uses Delphi 10 operator overloading

{$APPTYPE CONSOLE}
uses
  Math;

const
  Width = 512;
  Height = 512;

  M = 1048576; // 2^20
  J = 2045;
var
  oldI: integer = 12357;
type
  TFloat = double;

  (*
  TVector = record
    case integer of
      0: (x, y, z: TFloat;);
      1: (vector: array[1..3] of TFloat;);
  end;*)

  TVector = record
  public
      x, y, z: TFloat;
      constructor Create(a, b, c: TFloat);
      class operator Add(const [Ref] v1, v2: TVector): TVector;
      class operator Multiply(const [Ref] v: TVector; r: TFloat): TVector;
      class operator Multiply(const [Ref] v1, v2: TVector): TFloat;
      class operator LogicalNot(const [Ref] v: TVector): TVector;
      class operator LogicalXor(const [Ref] v1, v2: TVector): TVector;
  end;

  function rand0_1(): TFloat; inline;
  begin
    oldI := (oldI * J + 1) mod M;
    Result := oldI / M;
  end;

  constructor TVector.Create(a, b, c: TFloat);
  begin
    x := a;
    y := b;
    z := c;
  end;

 class operator TVector.Add(const [Ref] v1, v2: TVector): TVector;
  begin
    Result := TVector.Create(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
  end;
 (*
  operator -(const v1, v2: TVector): TVector;
  begin
    Result := Vector(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
  end;

  operator -(const v: TVector): TVector;
  begin
    Result := Vector(-v.x, -v.y, -v.z);
  end;
  *)
  class operator TVector.Multiply(const [Ref] v: TVector; r: TFloat): TVector;
  begin
    Result := TVector.Create(v.x * r, v.y * r, v.z * r);
  end;

  class operator TVector.Multiply(const [Ref] v1, v2: TVector): TFloat;
  begin
    Result := v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
  end;

  class operator TVector.LogicalXor(const [Ref] v1, v2: TVector): TVector;
  begin
    Result := TVector.Create(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x -
      v1.x * v2.z, v1.x * v2.y - v1.y * v2.x);
  end;

  class operator TVector.LogicalNot(const [Ref] v: TVector): TVector;
  var
    r: TFloat;
  begin
    r := sqrt(v * v);
    Result := v * (1 / r);
  end;

const
  Gt: array[0..8] of integer = (
    $0003C712,  // 00111100011100010010
    $00044814,  // 01000100100000010100
    $00044818,  // 01000100100000011000
    $0003CF94,  // 00111100111110010100
    $00004892,  // 00000100100010010010
    $00004891,  // 00000100100010010001
    $00038710,  // 00111000011100010000
    $00000010,  // 00000000000000010000
    $00000010  // 00000000000000010000
    );

  function tracer(const [Ref] o, d: TVector; out t: Tfloat; out n: TVector): integer;
  var
    k, j: integer;
    pp: TFloat;
    p: TVector;
    b: TFloat;
    c, q, s: TFloat;
  begin
    t := 1e9;
    Result := 0;
    pp := -o.z / d.z;
    if (0.01 < pp) then
    begin
      t := pp;
      n := TVector.Create(0, 0, 1);
      Result := 1;
    end;
    for k := 18 downto 0 do
    begin
      for j := 8 downto 0 do
      begin
        if (Gt[j] and (1 shl k)) = 0 then
          continue;
        p := o + TVector.Create(-k, 0, -(j + 4));
        b := p * d;
        c := p * p - 1;
        q := b * b - c;
        if (q <= 0) then
          continue;
        s := -b - sqrt(q);
        if (s < t) and (s > 0.01) then
        begin
          t := s;
          n := not (p + d * t);
          Result := 2;
        end;
      end;
    end;
  end;

  function sampler(const [Ref] o, d: TVector): TVector;
  var
    t: TFloat;
    n: TVector;
    m: integer;
    h, l, r, s: TVector;
    b, p: TFloat;
    p1, p2: TFloat;
  begin

    m := tracer(o, d, t, n);
    if (m = 0) then
      Exit(TVector.Create(0.7, 0.6, 1) * power(1 - d.z, 4));

    h := o + d * t;
    p2 := 9 + rand0_1();
    p1 := 9 + rand0_1();
    l := not (TVector.Create(p1, p2, 16) + h * -1);
    r := d + n * (n * d * (-2));
    b := l * n;
    if (b < 0) or (tracer(h, l, t, n) <> 0) then
      b := 0;

    p := power(l * r, 99) * Ord(b > 0);
    if (m and 1) <> 0 then
    begin
      h := h * 0.2;
      if ((ceil(h.x) + ceil(h.y)) and 1) <> 0 then
      begin
        s := TVector.Create(3, 1, 1);
      end
      else
      begin
        s := TVector.Create(3, 3, 3);
      end;
      Exit(s * (b * 0.2 + 0.1));
    end
    else
    begin
      Result := TVector.Create(p, p, p) + sampler(h, r) * 0.5;
    end;
  end;

var
  g, a, b, c, p, t, ta, tb: TVector;
  y, x, r: integer;
begin
  writeln('P6');
  //writeln('P3');
  writeln(Width, ' ', Height);
  Write('255 ');
  g := not TVector.Create(-6, -16, 0);
  a := (not (TVector.Create(0, 0, 1) xor g)) * 0.002;
  b := (not (g xor a)) * 0.002;
  c := (a + b) * (-256) + g;
  for y := Height - 1 downto 0 do
  begin
    ;
    for x := Width - 1 downto 0 do
    begin
      p := TVector.Create(13, 13, 13);
      for r := 64 downto 1 do
      begin
        tb := b * ((rand0_1() - 0.5) * 99);
        ta := a * ((rand0_1() - 0.5) * 99);
        t := ta + tb;
        p := sampler(TVector.Create(17, 16, 8) + t,
          not (t * (-1) + (a * (rand0_1() + x) + b * (y + rand0_1()) + c) * 16)) *
          3.5 + p;
      end;
      //writeln(min(round(p.x),255),' ',min(round(p.y),255),' ',min(round(p.z),255));
      Write(char(round(p.x)), char(round(p.y)), char(round(p.z)));
    end;
  end;
end.


Не ожидал что вообще кто-то делает МР-ы. И еще есть другой по Котлину.
15 сен 20, 22:02    [22197859]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
2 Alexey Tomin.

Замержил Kotlin-Native.

Спасибо за фиксацию .gitignore. Давно уже надо было сделать.

Отвечаю на ваш вопрос по прогреву и JMH. Я собирал сборки с опциями Ahead-Of-Time и скорость исполнения
не сильно отличалась от обычной. Разница была в рамках стат-погрешности. И я посчитал не особо важным
отдельно создавать прогревающие процедуры.
15 сен 20, 22:29    [22197876]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Добавил поддержку OpenMP.

Опытным путём установил что тормозом является функция rand()

double Random() {
	//return (double) rand() / RAND_MAX;
	return 0.0;
}


Кажется у меня дежа-вю. Уже кто-то ловил подобный дефект. Но вот в чем штука.
Как это решить в парадигме OpenMP? Тоесть как объявить что данное состояние
функции является thread-local по отношению к OpenMP тредам которые создаются
макросом?

Кто знаток OpenMP - подскажите?

	printf("Start with OpenMP support\n");
	printf("omp_get_max_threads = %d\n", omp_get_max_threads());

  struct timespec start, end;
	clock_gettime(CLOCK_MONOTONIC_RAW, &start);

	FILE *out = fopen(argv[1],"w");
	fprintf(out,"P6 %d %d 255 ",WIDTH,HEIGHT);
	Vector g = !Vector(-6, -16, 0);
    Vector a = !(Vector(0, 0, 1) ^ g) * .002;
    Vector b = !(g ^ a) * .002;
    Vector c = (a + b) * -256 + g;

  int PART_SIZE = HEIGHT / PARTITIONS;

  printf("Partitions = %d\n", PARTITIONS);
	printf("Partition height = %d\n", PART_SIZE);

  int *buf = new int[WIDTH * HEIGHT * 4];

  omp_set_num_threads(12);
	#pragma omp parallel for
	for (int p = 0; p < PARTITIONS; p++) {
		printf("Started OpenMP-thread %i for partition (y=%d)\n", omp_get_thread_num(), p);
		for (int y = 0; y < PART_SIZE; y++) {
			int y_offset = y + p * PART_SIZE;
			for (int x = 0 ; x < WIDTH; x++) {
				Vector p(13, 13, 13);
				for (int r = 64; r--;) {
					Vector t = a * (Random() - .5) * 99 + b * (Random() - .5) * 99;
					p = sampler(Vector(17, 16, 8) + t, !(t * -1 + (a * (Random() + x) + b * (y_offset + Random()) + c) * 16)) * 3.5 + p;
				}
				buf[x + y_offset * WIDTH] =  (int) p.x << 16 |
				                             (int) p.y << 8 |
														         (int) p.z;
			}
		}
		printf("Finished thread %i\n", omp_get_thread_num());
  }
	printf("Writing buffer...\n");
	for (int y = 0; y < HEIGHT; y++) {
		for (int x = 0 ; x < WIDTH; x++) {
			int rgb = buf[(WIDTH - x - 1) + (HEIGHT - y - 1) * WIDTH];
			fprintf(out,"%c", 0xFF & (rgb >> 16));
			fprintf(out,"%c", 0xFF & (rgb >> 8));
			fprintf(out,"%c", 0xFF & rgb);
		}
	}
	fclose(out);
	delete buf;
	clock_gettime(CLOCK_MONOTONIC_RAW, &end);
	//u_int64_t delta_us = end.tv_sec - start.tv_sec;
	int delta_us = end.tv_sec - start.tv_sec;
	printf("Finish. Elapsed time : %i s\n", delta_us);


Исходник является копи-пастой "C"-шного с небольшими изменениями.

Лог c rand() - 26s

+
#!/bin/bash -ve

rm -f card-raytracer-openmp.exe

export OMP_DISPLAY_ENV="TRUE"

g++ -O3 -o card-raytracer-openmp.exe \
    -fopenmp card-raytracer-openmp.c

echo "Error code = $?"
Error code = 0
Start with OpenMP support
omp_get_max_threads = 12
Partitions = 16
Partition height = 32
Started OpenMP-thread 8 for partition (y=12)
Started OpenMP-thread 2 for partition (y=4)
Started OpenMP-thread 6 for partition (y=10)
Started OpenMP-thread 0 for partition (y=0)
Started OpenMP-thread 4 for partition (y=8)
Started OpenMP-thread 10 for partition (y=14)
Started OpenMP-thread 3 for partition (y=6)
Started OpenMP-thread 7 for partition (y=11)
Started OpenMP-thread 11 for partition (y=15)
Started OpenMP-thread 5 for partition (y=9)
Started OpenMP-thread 9 for partition (y=13)
Started OpenMP-thread 1 for partition (y=2)
Finished thread 9
Finished thread 10
Finished thread 11
Finished thread 8
Finished thread 7
Finished thread 6
Finished thread 4
Finished thread 0
Started OpenMP-thread 0 for partition (y=1)
Finished thread 1
Started OpenMP-thread 1 for partition (y=3)
Finished thread 5
Finished thread 2
Started OpenMP-thread 2 for partition (y=5)
Finished thread 3
Started OpenMP-thread 3 for partition (y=7)
Finished thread 0
Finished thread 1
Finished thread 2
Finished thread 3
Writing buffer...
Finish. Elapsed time : 26 s


Лог без rand() - примерно 2 секунды

Finished thread 3
Started OpenMP-thread 3 for partition (y=7)
Finished thread 0
Finished thread 1
Finished thread 2
Finished thread 3
Writing buffer...
Finish. Elapsed time : 2 s
1 ноя 21, 00:17    [22390823]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Картинка - вроде норм. (шума в тенях нету как раз из-за отключенного ГСЧ).

К сообщению приложен файл. Размер - 139Kb
1 ноя 21, 00:20    [22390824]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 53009
Можно добавить линейный конгруэнтный генератор прям сюда. Заинлайнить.

p = sampler(Vector(17, 16, 8) + t, !(t * -1 + (a * (............ + x) + b * (y_offset + ..........) + c) * 16)) * 3.5 + p;


но это некрасиво. Куча переменных.

В Java обычно я делал так. В декларации класса:

class CardRaytracer {

    private ThreadLocal<Random> random = .....;


}

Вот хотелось такого-же сахара в OpenMP.
1 ноя 21, 10:51    [22390895]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6645
mayton
Кажется у меня дежа-вю. Уже кто-то ловил подобный дефект. Но вот в чем штука.
Как это решить в парадигме OpenMP? Тоесть как объявить что данное состояние
функции является thread-local по отношению к OpenMP тредам которые создаются
макросом?
я говорил, немного по другому поводу, когда делали реализации на разных языках: "генераторы везде разные", и предлагал его заменить на стандартную формулу.

в силу архитектуры (если быть точным), что бы всегда сходилось к единому результату. придётся генерировать числа до того как "запускать" OpenMP.
Либо говорить что мы этим пожертвуем, но придумаем как сделать так, что бы это было не критично.
1 ноя 21, 11:10    [22390910]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 35 36 37 38 39 40 41 42 [43] 44   вперед  Ctrl
Все форумы / Программирование Ответить