LINUX.ORG.RU

Нужна помочь владельцев core2 в измерении производительности программы

 , , ,


0

3

Есть программа.

#include <boost/hana.hpp>
#include <limits>
#include <array>
#include <sys/mman.h>
#include <unistd.h>
#include <cassert>
#include <filesystem>
#include <string_view>
#include <vector>

namespace hana = boost::hana;
namespace fs = std::filesystem;

using namespace hana::literals;

using sv = std::string_view;

using hana::_;


constexpr uint8_t swmap(uint8_t c) {
  switch(c) {
    case 'A': case 'a': return 'T';// 'A' | 'a' => 'T',
    case 'C': case 'c': return 'G';// 'C' | 'c' => 'G',
    case 'G': case 'g': return 'C';// 'G' | 'g' => 'C',
    case 'T': case 't': return 'A';// 'T' | 't' => 'A',
    case 'U': case 'u': return 'A';// 'U' | 'u' => 'A',
    case 'M': case 'm': return 'K';// 'M' | 'm' => 'K',
    case 'R': case 'r': return 'Y';// 'R' | 'r' => 'Y',
    case 'W': case 'w': return 'W';// 'W' | 'w' => 'W',
    case 'S': case 's': return 'S';// 'S' | 's' => 'S',
    case 'Y': case 'y': return 'R';// 'Y' | 'y' => 'R',
    case 'K': case 'k': return 'M';// 'K' | 'k' => 'M',
    case 'V': case 'v': return 'B';// 'V' | 'v' => 'B',
    case 'H': case 'h': return 'D';// 'H' | 'h' => 'D',
    case 'D': case 'd': return 'H';// 'D' | 'd' => 'H',
    case 'B': case 'b': return 'V';// 'B' | 'b' => 'V',
    case 'N': case 'n': return 'N';// 'N' | 'n' => 'N',
    default: return 0;
  }
}

constexpr auto map = ([] {
  constexpr auto max = std::numeric_limits<uint8_t>::max();
  std::array<uint16_t, max * max> map{};
  for(size_t it = 0; it < map.size(); ++it) {
    uint8_t hi = (it >> 8), lo = it;
    map[it] = (swmap(lo) << 8) | (swmap(hi));
  }
  return map;
})();

constexpr auto map256 = ([] {
  constexpr auto max = std::numeric_limits<uint8_t>::max();
  std::array<uint8_t, max> map{};
  for(size_t it = 0; it < max; ++it)
    map[it] = swmap(it);
  return map;
})();

template<size_t noffset> void replace60(const char * in, char * out) {
  constexpr auto offset = hana::llong_c<noffset>;
  
  auto op = [&] {
    *(uint16_t *)out = map[*(const uint16_t *)(in -= 2)];
    out += 2;
  };
  
  auto tail_size = ((60_c - offset) / 2_c);
  tail_size.times(op);
  
  if constexpr(offset % 2_c) {
//   ...1\n  
//   0...  
    *out++ = map256[*(--in)];
    --in;
//     assert(*in == '\n');
    *out++ = map256[*(--in)];
    (29_c - tail_size).times(op);
  } else {// even
//   ...\n  
//   ...  
    in -= 1;
//     assert(*in == '\n');
    (30_c - tail_size).times(op);
  }
  *(out++) = '\n';
}

auto select_replace60 = [](std::string_view in) {
  constexpr static auto replace60_map = ([] {
    std::array<decltype(replace60<0>) *, 60> map{};
    (60_c).times.with_index([&](auto index) {
      map[index()] = replace60<index()>;
    });
    return map;
  })();
  
  auto first_pos = size(in) - 1;
  assert(in.at(first_pos) == '\n');
  
  auto diff = first_pos - in.find_last_of('\n', first_pos - 1);
  assert(in.at(size(in) - diff - 1) == '\n');
  
  return replace60_map.at(61 - diff);
};


void replace(sv data) {
  auto op = select_replace60(data);
  constexpr size_t line_size = 61;
  constexpr size_t buff_size = line_size * 1024;
  char buff[buff_size] = {};
  auto n = size(data) / line_size;
  auto tail = size(data) - (n * line_size);
  
  auto it = end(data) - 1;
  auto buff_it = std::begin(buff);
  
  while(n--) {
    op(it, buff_it);
    buff_it += line_size;
    it -= line_size;
    if(buff_it == (std::end(buff) - line_size)) {
      write(STDOUT_FILENO, buff, buff_size - line_size);
      buff_it = buff;
    }
  }
  if(tail) {
    while(tail--) {
      if(*(--it) == '\n') continue;
      *buff_it++ = map256[*it];
    }
    *buff_it++ = '\n';
  }
  write(STDOUT_FILENO, buff, buff_it - std::begin(buff));
}

template<typename F> __attribute_noinline__ auto bench(std::string_view name, F && f, size_t setsize) {
  auto start = std::chrono::high_resolution_clock::now();
  f();
  auto tp = std::chrono::high_resolution_clock::now() - start;
  auto time = std::chrono::duration<double>{tp}.count();
  fprintf(stderr, "%s: %fsec, %fGB/s\n", name.data(), time, (setsize / double(1ul << 30)) / time);
}

int main() {
  
  fs::path path{"/dev/stdin"};
  auto size = fs::file_size(path);
  auto data = (const char *)mmap(nullptr, size + 4096, PROT_READ, MAP_PRIVATE|MAP_POPULATE, STDIN_FILENO, 0);
  sv file{data, size};
  
  auto next = [=, prev = 0ul]() mutable -> std::pair<sv, sv> {
    auto arrow_pos = file.find_first_of('>', prev);
    auto begin_pos = file.find_first_of('\n', arrow_pos);
    if(begin_pos == sv::npos) return {};
    prev = file.find_first_of('>', begin_pos);
    return {file.substr(arrow_pos, begin_pos - arrow_pos + 1), file.substr(begin_pos + 1, prev - begin_pos - 1)};
  };
  
  std::vector<std::pair<sv, sv>> index;
  for(auto pair = next(); pair != std::pair<sv, sv>{}; pair = next()) index.emplace_back(pair);
    
  
  for(auto [name, data]: index) {
    write(STDOUT_FILENO, std::data(name), std::size(name));
    bench("replace", [data = data] { replace(data); }, data.size());
  };
}
 

Есть вторая программа: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/revcomp-g...

Нужно сравнить их, собирать так(нужен буст) и gcc8.3 или новее.

g++ -Ofast -march=native -fwhole-program -std=gnu++2a -lstdc++fs main.cpp -o prog_name

Для того, что-бы забенчить - нужно взять этот код: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/fasta-gcc... Записать в fasta.c

Собрать так:

gcc -pipe -Wall -O3 -fomit-frame-pointer -march=native -fopenmp fasta.c -o fasta

Далее, нужно сделать следующие:

./fasta 100000000 > fasta_100000000.txt


time ./первая_программа 0 < fasta_100000000.txt > /dev/null

time ./вторая_программа 0 < fasta_100000000.txt > /dev/null

Запустить надо по 2-3 раза. Результаты напечатать сюда.

завтра забенчу, пока поставил собирать gcc на Intel® Core™2 Duo P8400

$ brew install gcc
Warning: You are using macOS 10.11.
We (and Apple) do not provide support for this old version.
You will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew's GitHub,
Discourse, Twitter or IRC. You are responsible for resolving any issues you
experience while you are running this old version.

==> Downloading https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz
Already downloaded: /Users/fsb4000/Library/Caches/Homebrew/downloads/d826388c1d62d3837abf5966bfcb52111c0fea536be81417ab4718ba089422f1--gcc-9.2.0.tar.xz
==> ../configure --build=x86_64-apple-darwin15 --prefix=/usr/local/Cellar/gcc/9.2.0_1 --libdir=/usr/local/Cellar/gcc/9.2.0_1/lib/gcc/9 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=

==> make BOOT_LDFLAGS=-Wl,-headerpad_max_install_names

fsb4000 ★★★★ ()
  1. Обращаясь с такой просьбой неплохо-бы сделать репу на github с makefile внутри, т.е. свести к git clone URL DIR && make -C DIR bench.

  2. mmap(stdin) - нормально, hana - пятая нога и 16-битный FSM уроет это всё примерно вдвое, а другими хаками можно ускорить еще примерно вдвое (без многопоточности).

  3. «Вторая программа» ничего не читает, а просто генерирует мусор. (причем с какими-то странными кульбитами «неуловимого джо», как-будто хочет обогнать скорость записи в память). Совсем не понятно к чему их сравнивать.

Но любопытно почему именно core2, т.е. почему интересен CPU 10-летней давности?

Deleted ()
Ответ на: комментарий от freddie_sadler
time ./2 0 < fasta_100000000.txt > /dev/null

real    0m4.171s
user    0m1.518s
sys     0m1.943s
time ./1 0 < fasta_100000000.txt > /dev/null

real    0m1.699s
user    0m1.141s
sys     0m0.550s

gcc 9.2.0, boost 1.71

Только пришлось удалить MAP_POPULATE

https://stackoverflow.com/questions/35568112/use-of-undeclared-identifier-map...

запускал 3 раза, написал лучшее время каждой программы

1 это с <boost/hana.hpp>

fsb4000 ★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от Deleted

Обращаясь с такой просьбой неплохо-бы сделать репу на github с makefile внутри, т.е. свести к git clone URL DIR && make -C DIR bench.

Хорошо.

mmap(stdin) - нормально, hana - пятая нога и 16-битный FSM уроет это всё примерно вдвое, а другими хаками можно ускорить еще примерно вдвое (без многопоточности).

Покажи класс.

«Вторая программа» ничего не читает, а просто генерирует мусор. (причем с какими-то странными кульбитами «неуловимого джо», как-будто хочет обогнать скорость записи в память). Совсем не понятно к чему их сравнивать.

Ну она работает(правда она забаганная, да) вроде как. Это топ отсюда: https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/revco...

Но любопытно почему именно core2, т.е. почему интересен CPU 10-летней давности?

Потому что автор https://benchmarksgame-team.pages.debian.net/benchmarksgame идиот и с этим ничего не поделать.

freddie_sadler ()
Ответ на: комментарий от fsb4000

Странные результаты, конечно. Макос что-то криво считает. Я очень сомневаюсь, что мой реплейс всего лишь менее чем в полтора раза быстрее. Может там memchr говно.

#include <boost/hana.hpp>
#include <limits>
#include <array>
#include <sys/mman.h>
#include <unistd.h>
#include <cassert>
#include <filesystem>
#include <string_view>
#include <vector>

namespace hana = boost::hana;
namespace fs = std::filesystem;

using namespace hana::literals;

using sv = std::string_view;

using hana::_;


constexpr uint8_t swmap(uint8_t c) {
  switch(c) {
    case 'A': case 'a': return 'T';// 'A' | 'a' => 'T',
    case 'C': case 'c': return 'G';// 'C' | 'c' => 'G',
    case 'G': case 'g': return 'C';// 'G' | 'g' => 'C',
    case 'T': case 't': return 'A';// 'T' | 't' => 'A',
    case 'U': case 'u': return 'A';// 'U' | 'u' => 'A',
    case 'M': case 'm': return 'K';// 'M' | 'm' => 'K',
    case 'R': case 'r': return 'Y';// 'R' | 'r' => 'Y',
    case 'W': case 'w': return 'W';// 'W' | 'w' => 'W',
    case 'S': case 's': return 'S';// 'S' | 's' => 'S',
    case 'Y': case 'y': return 'R';// 'Y' | 'y' => 'R',
    case 'K': case 'k': return 'M';// 'K' | 'k' => 'M',
    case 'V': case 'v': return 'B';// 'V' | 'v' => 'B',
    case 'H': case 'h': return 'D';// 'H' | 'h' => 'D',
    case 'D': case 'd': return 'H';// 'D' | 'd' => 'H',
    case 'B': case 'b': return 'V';// 'B' | 'b' => 'V',
    case 'N': case 'n': return 'N';// 'N' | 'n' => 'N',
    default: return 0;
  }
}

constexpr auto map = ([] {
  constexpr auto max = std::numeric_limits<uint8_t>::max();
  std::array<uint16_t, max * max> map{};
  for(size_t it = 0; it < map.size(); ++it) {
    uint8_t hi = (it >> 8), lo = it;
    map[it] = (swmap(lo) << 8) | (swmap(hi));
  }
  return map;
})();

constexpr auto map256 = ([] {
  constexpr auto max = std::numeric_limits<uint8_t>::max();
  std::array<uint8_t, max> map{};
  for(size_t it = 0; it < max; ++it)
    map[it] = swmap(it);
  return map;
})();

template<size_t noffset> void replace60(const char * in, char * out) {
  constexpr auto offset = hana::llong_c<noffset>;
  
  auto op = [&] {
    *(uint16_t *)out = map[*(const uint16_t *)(in -= 2)];
    out += 2;
  };
  
  auto tail_size = ((60_c - offset) / 2_c);
  tail_size.times(op);
  
  if constexpr(offset % 2_c) {
//   ...1\n  
//   0...  
    *out++ = map256[*(--in)];
    --in;
//     assert(*in == '\n');
    *out++ = map256[*(--in)];
    (29_c - tail_size).times(op);
  } else {// even
//   ...\n  
//   ...  
    in -= 1;
//     assert(*in == '\n');
    (30_c - tail_size).times(op);
  }
  *(out++) = '\n';
}

auto select_replace60 = [](std::string_view in) {
  constexpr static auto replace60_map = ([] {
    std::array<decltype(replace60<0>) *, 60> map{};
    (60_c).times.with_index([&](auto index) {
      map[index()] = replace60<index()>;
    });
    return map;
  })();
  
  auto first_pos = size(in) - 1;
  assert(in.at(first_pos) == '\n');
  
  auto diff = first_pos - in.find_last_of('\n', first_pos - 1);
  assert(in.at(size(in) - diff - 1) == '\n');
  
  return replace60_map.at(61 - diff);
};


void replace(sv data) {
  auto op = select_replace60(data);
  constexpr size_t line_size = 61;
  constexpr size_t buff_size = line_size * 1024;
  char buff[buff_size] = {};
  auto n = size(data) / line_size;
  auto tail = size(data) - (n * line_size);
  
  auto it = end(data) - 1;
  auto buff_it = std::begin(buff);
  
  while(n--) {
    op(it, buff_it);
    buff_it += line_size;
    it -= line_size;
    if(buff_it == (std::end(buff) - line_size)) {
      write(STDOUT_FILENO, buff, buff_size - line_size);
      buff_it = buff;
    }
  }
  if(tail) {
    while(tail--) {
      if(*(--it) == '\n') continue;
      *buff_it++ = map256[*it];
    }
    *buff_it++ = '\n';
  }
  write(STDOUT_FILENO, buff, buff_it - std::begin(buff));
}

template<typename F> __attribute_noinline__ auto bench(std::string_view name, F && f, size_t setsize) {
  auto start = std::chrono::high_resolution_clock::now();
  f();
  auto tp = std::chrono::high_resolution_clock::now() - start;
  auto time = std::chrono::duration<double>{tp}.count();
  fprintf(stderr, "%s: %fsec, %fGB/s\n", name.data(), time, (setsize / double(1ul << 30)) / time);
}

int main() {
  
  fs::path path{"/dev/stdin"};
  auto size = fs::file_size(path);
  auto data = (const char *)mmap(nullptr, size + 4096, PROT_READ, MAP_PRIVATE|MAP_POPULATE, STDIN_FILENO, 0);
  sv file{data, size};
  
  auto next = [=, prev = 0ul]() mutable -> std::pair<sv, sv> {
    auto arrow_pos = file.find_first_of('>', prev);
    auto begin_pos = file.find_first_of('\n', arrow_pos);
    if(begin_pos == sv::npos) return {};
    prev = file.find_first_of('>', begin_pos);
    return {file.substr(arrow_pos, begin_pos - arrow_pos + 1), file.substr(begin_pos + 1, prev - begin_pos - 1)};
  };
  
  std::vector<std::pair<sv, sv>> index;
  for(auto pair = next(); pair != std::pair<sv, sv>{}; pair = next()) index.emplace_back(pair);
    
  
  for(auto [name, data]: index) {
    write(STDOUT_FILENO, std::data(name), std::size(name));
    bench("replace", [data = data] { replace(data); }, data.size());
  };
}
 

Запустим, пж, эту версию. Я добавил бенч. Теперь оно покажет время на сам реплейс. Так же, возможно, там write дорогой. Попробуй подкрутить:

constexpr size_t buff_size = line_size * 1024;//домножь его на 4/8/32/64... пока не упадёт. 

Хотя оно должно его считать в system, но вдруг кривое.

Я заслал его автору - посмотрим что он там набенчит.

freddie_sadler ()

Проц Celeron e3200 разогнанный до 2.9.

for PROG in 1 2 ; do echo «source $PROG»; for i in 1, 2, 3 ; do time ./$PROG 0 < fasta_100000000.txt > /dev/null; done; done

source 1

real 0m0.820s
user 0m0.663s
sys 0m0.155s

real 0m0.810s
user 0m0.665s
sys 0m0.144s

real 0m0.817s
user 0m0.662s
sys 0m0.155s

source 2

real 0m2.152s
user 0m1.263s
sys 0m1.362s

real 0m1.856s
user 0m1.164s
sys 0m1.087s

real 0m1.963s
user 0m1.300s
sys 0m1.117s

x13 ()
Ответ на: комментарий от x13

Спс, насколько я понимаю тут два ядра? Судя по сайту да.

Попробуй ещё:

time taskset -c 0 ./prog 0 < fasta_100000000.txt > /dev/null 

Это для source 2. source 1 не должен изменится - он однопоточный.

Так же, можешь заменить source 1 на код из этого поста: Нужна помочь владельцев core2 в измерении производительности программы (комментарий) - я добавил там вывод статистики.

freddie_sadler ()
Ответ на: комментарий от freddie_sadler

новый вариант обозвал 1.1

for PROG in 1.1 2 ; do echo "source $PROG" ; for i in 1 2 3 ; do time taskset -c 0 ./$PROG 0 < fasta_100000000.txt > /dev/null ; done ; done
source 1.1
replace: 0.100974sec, 1.875414GB/s
replace: 0.148225sec, 1.916363GB/s
replace: 0.248469sec, 1.905355GB/s

real	0m1.294s
user	0m0.665s
sys	0m0.201s
replace: 0.100297sec, 1.888087GB/s
replace: 0.147695sec, 1.923240GB/s
replace: 0.425416sec, 1.112847GB/s

real	0m1.001s
user	0m0.828s
sys	0m0.170s
replace: 0.099903sec, 1.895534GB/s
replace: 0.146803sec, 1.934927GB/s
replace: 0.245926sec, 1.925063GB/s

real	0m0.803s
user	0m0.657s
sys	0m0.146s
source 2

real	0m2.820s
user	0m1.735s
sys	0m1.076s

real	0m2.863s
user	0m1.654s
sys	0m1.115s

real	0m2.001s
user	0m0.974s
sys	0m1.027s

и без taskset
 for i in 1, 2, 3 ; do time ./1.1 0 < fasta_100000000.txt > /dev/null; done
replace: 0.100169sec, 1.890488GB/s
replace: 0.147487sec, 1.925952GB/s
replace: 0.247323sec, 1.914190GB/s

real	0m0.820s
user	0m0.656s
sys	0m0.151s
replace: 0.099473sec, 1.903728GB/s
replace: 0.146533sec, 1.938497GB/s
replace: 0.245306sec, 1.929924GB/s

real	0m0.798s
user	0m0.657s
sys	0m0.140s
replace: 0.099795sec, 1.897585GB/s
replace: 0.146909sec, 1.933536GB/s
replace: 0.245890sec, 1.925343GB/s

real	0m0.801s
user	0m0.659s
sys	0m0.142s

x13 ()

Царь вернулся!

anonymous ()
Ответ на: комментарий от x13

Теоретический максимум там байт на такт. Для реплейса через таблицу нужно 2 чтения и запись. Кора2 может читать один раз за такт. Т.е. 2 такта. Обрабатывает за один реплейс оно 2 байта. Таким образом 1 так на байт.

Т.е. (2.9 * 10^9) / 2^30 ~= 2.7 гб. Ну 2 гига это рядом, там оно ещё в /dev/null пишет. Я напишу бенчмарк чисто для реплейса - посмотрим, если интересно.

На самом деле я не делал здесь оптимизацию для core2 и нехалема. Нужно добавить. Хотя, возможно, даже sb этим страдает.

freddie_sadler ()
Ответ на: комментарий от freddie_sadler

Попробовал запустить.

Исправил только это. (удалил аттрибут)

 g++-9 -Ofast -march=native -fwhole-program -std=gnu++2a -lstdc++fs main3.cpp -o 3
main3.cpp:139:22: error: '__attribute_noinline__' does not name a type
  139 | template<typename F> __attribute_noinline__ auto bench(std::string_view name, F && f, size_t setsize) {

4 это 3 с

constexpr size_t buff_size = line_size * 1024 * 128;

for PROG in 1 2 3 4 ; do echo "source $PROG"; for i in 1, 2, 3 ; do time ./$PROG 0 < fasta_100000000.txt > /dev/null; done; done
source 1

real    0m1.685s
user    0m1.125s
sys     0m0.510s

real    0m1.651s
user    0m1.126s
sys     0m0.506s

real    0m1.640s
user    0m1.120s
sys     0m0.499s
source 2

real    0m4.471s
user    0m1.476s
sys     0m2.694s

real    0m3.900s
user    0m1.423s
sys     0m2.103s

real    0m3.655s
user    0m1.415s
sys     0m1.980s
source 3
replace: 0.140054sec, 1.352114GB/s
replace: 0.209207sec, 1.357762GB/s
replace: 0.350408sec, 1.351060GB/s

real    0m2.404s
user    0m1.131s
sys     0m0.605s
replace: 0.139719sec, 1.355356GB/s
replace: 0.210292sec, 1.350757GB/s
replace: 0.348478sec, 1.358543GB/s

real    0m1.660s
user    0m1.126s
sys     0m0.521s
replace: 0.138671sec, 1.365599GB/s
replace: 0.209871sec, 1.353467GB/s
replace: 0.348412sec, 1.358800GB/s

real    0m1.665s
user    0m1.123s
sys     0m0.520s
source 4
replace: 0.181587sec, 1.042855GB/s
replace: 0.241529sec, 1.176063GB/s
replace: 0.402196sec, 1.177094GB/s

real    0m1.813s
user    0m1.247s
sys     0m0.510s
replace: 0.167530sec, 1.130358GB/s
replace: 0.244053sec, 1.163900GB/s
replace: 0.402884sec, 1.175083GB/s

real    0m1.782s
user    0m1.243s
sys     0m0.520s
replace: 0.169406sec, 1.117841GB/s
replace: 0.242303sec, 1.172307GB/s
replace: 0.398346sec, 1.188470GB/s

real    0m1.775s
user    0m1.243s
sys     0m0.515s

Про taskset

taskset: command not found

brew install taskset
Error: No available formula with the name "taskset"
==> Searching for a previously deleted formula (in the last month)...
Warning: homebrew/core is shallow clone. To get complete history run:
  git -C "$(brew --repo homebrew/core)" fetch --unshallow

Error: No previously deleted formula found.
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
Error: No formulae found in taps.
g++-9 -v
Using built-in specs.
COLLECT_GCC=g++-9
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/9.2.0_1/libexec/gcc/x86_64-apple-darwin15/9.2.0/lto-wrapper
Target: x86_64-apple-darwin15
Configured with: ../configure --build=x86_64-apple-darwin15 --prefix=/usr/local/Cellar/gcc/9.2.0_1 --libdir=/usr/local/Cellar/gcc/9.2.0_1/lib/gcc/9 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-9 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --with-pkgversion='Homebrew GCC 9.2.0_1' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues
Thread model: posix
gcc version 9.2.0 (Homebrew GCC 9.2.0_1)
fsb4000 ★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Больше становится, да. Ну тут нужно смотреть. Увеличение буфера увеличивает потребление кеша(и он может протечь), но уменьшает кол-во вызовов write.

Я в свободное время займусь написанием бенчмарка и десятка ре плейсов(у меня много идей). Тут реплейс говно(в целом), нету оптимизаций под коре2(я не делал под него).

Можно будет лор подключить - пацан уже хотел поучаствовать выше. Авось кто ещё захочет.

freddie_sadler ()
Ответ на: комментарий от freddie_sadler

Затестил все варианты буфера. (при 256 уже падает)

source 1
replace: 0.137137sec, 1.380874GB/s
replace: 0.208541sec, 1.362099GB/s
replace: 0.350757sec, 1.349716GB/s

real	0m1.663s
user	0m1.126s
sys	0m0.518s
replace: 0.138176sec, 1.370491GB/s
replace: 0.209593sec, 1.355262GB/s
replace: 0.347905sec, 1.360780GB/s

real	0m1.664s
user	0m1.124s
sys	0m0.521s
replace: 0.136683sec, 1.385461GB/s
replace: 0.208734sec, 1.360839GB/s
replace: 0.348411sec, 1.358804GB/s

real	0m1.652s
user	0m1.124s
sys	0m0.510s
source 2
replace: 0.134413sec, 1.408859GB/s
replace: 0.207460sec, 1.369196GB/s
replace: 0.340132sec, 1.391878GB/s

real	0m1.655s
user	0m1.121s
sys	0m0.516s
replace: 0.139145sec, 1.360947GB/s
replace: 0.204503sec, 1.388994GB/s
replace: 0.339670sec, 1.393771GB/s

real	0m1.647s
user	0m1.120s
sys	0m0.504s
replace: 0.135016sec, 1.402567GB/s
replace: 0.203951sec, 1.392753GB/s
replace: 0.340103sec, 1.391997GB/s

real	0m1.649s
user	0m1.119s
sys	0m0.507s
source 4
replace: 0.134328sec, 1.409750GB/s
replace: 0.203121sec, 1.398444GB/s
replace: 0.336365sec, 1.407466GB/s

real	0m1.637s
user	0m1.114s
sys	0m0.506s
replace: 0.133264sec, 1.421006GB/s
replace: 0.201588sec, 1.409079GB/s
replace: 0.335780sec, 1.409918GB/s

real	0m1.640s
user	0m1.115s
sys	0m0.509s
replace: 0.134163sec, 1.411484GB/s
replace: 0.201798sec, 1.407612GB/s
replace: 0.335427sec, 1.411402GB/s

real	0m1.634s
user	0m1.115s
sys	0m0.502s
source 8
replace: 0.135268sec, 1.399954GB/s
replace: 0.201243sec, 1.411494GB/s
replace: 0.333659sec, 1.418881GB/s

real	0m1.637s
user	0m1.112s
sys	0m0.511s
replace: 0.132559sec, 1.428563GB/s
replace: 0.201247sec, 1.411466GB/s
replace: 0.333856sec, 1.418043GB/s

real	0m1.653s
user	0m1.117s
sys	0m0.518s
replace: 0.132755sec, 1.426454GB/s
replace: 0.201516sec, 1.409582GB/s
replace: 0.340172sec, 1.391715GB/s

real	0m1.644s
user	0m1.115s
sys	0m0.511s
source 16
replace: 0.133929sec, 1.413950GB/s
replace: 0.203376sec, 1.396691GB/s
replace: 0.340895sec, 1.388763GB/s

real	0m1.640s
user	0m1.119s
sys	0m0.501s
replace: 0.134986sec, 1.402878GB/s
replace: 0.206108sec, 1.378177GB/s
replace: 0.337379sec, 1.403236GB/s

real	0m1.634s
user	0m1.118s
sys	0m0.498s
replace: 0.134254sec, 1.410527GB/s
replace: 0.205517sec, 1.382141GB/s
replace: 0.335805sec, 1.409813GB/s

real	0m1.635s
user	0m1.115s
sys	0m0.503s
source 32
replace: 0.153382sec, 1.234623GB/s
replace: 0.225317sec, 1.260683GB/s
replace: 0.376790sec, 1.256462GB/s

real	0m1.733s
user	0m1.197s
sys	0m0.513s
replace: 0.150456sec, 1.258633GB/s
replace: 0.223396sec, 1.271524GB/s
replace: 0.371541sec, 1.274213GB/s

real	0m1.713s
user	0m1.185s
sys	0m0.509s
replace: 0.149506sec, 1.266631GB/s
replace: 0.224817sec, 1.263487GB/s
replace: 0.372856sec, 1.269719GB/s

real	0m1.726s
user	0m1.192s
sys	0m0.516s
source 64
replace: 0.160033sec, 1.183312GB/s
replace: 0.236051sec, 1.203356GB/s
replace: 0.393663sec, 1.202608GB/s

real	0m1.748s
user	0m1.229s
sys	0m0.506s
replace: 0.159597sec, 1.186544GB/s
replace: 0.237570sec, 1.195662GB/s
replace: 0.395216sec, 1.197882GB/s

real	0m1.757s
user	0m1.231s
sys	0m0.512s
replace: 0.159007sec, 1.190947GB/s
replace: 0.240297sec, 1.182093GB/s
replace: 0.396478sec, 1.194070GB/s

real	0m1.770s
user	0m1.230s
sys	0m0.516s
source 128
replace: 0.164808sec, 1.149027GB/s
replace: 0.244191sec, 1.163243GB/s
replace: 0.396105sec, 1.195194GB/s

real	0m1.779s
user	0m1.244s
sys	0m0.516s
replace: 0.165411sec, 1.144839GB/s
replace: 0.238614sec, 1.190431GB/s
replace: 0.395433sec, 1.197225GB/s

real	0m1.771s
user	0m1.237s
sys	0m0.514s
replace: 0.164427sec, 1.151690GB/s
replace: 0.239884sec, 1.184128GB/s
replace: 0.395551sec, 1.196868GB/s

real	0m1.776s
user	0m1.239s
sys	0m0.521s

fsb4000 ★★★★ ()
Ответ на: комментарий от anonymous
source last
replace::lut<uint8_t>: 1.950526sec, 1.025364GB/s
replace::lut<uint16_t>: 0.977546sec, 2.045940GB/s
replace::lut_core2<uint8_t>: 1.625841sec, 1.230133GB/s
replace::lut_core2<uint16_t>: 0.800985sec, 2.496926GB/s

real    0m5.362s
user    0m5.308s
sys     0m0.011s
replace::lut<uint8_t>: 1.944837sec, 1.028364GB/s
replace::lut<uint16_t>: 0.974314sec, 2.052726GB/s
replace::lut_core2<uint8_t>: 1.636958sec, 1.221778GB/s
replace::lut_core2<uint16_t>: 0.803458sec, 2.489240GB/s

real    0m5.365s
user    0m5.310s
sys     0m0.011s
replace::lut<uint8_t>: 1.950692sec, 1.025277GB/s
replace::lut<uint16_t>: 0.971079sec, 2.059565GB/s
replace::lut_core2<uint8_t>: 1.624607sec, 1.231067GB/s
replace::lut_core2<uint16_t>: 0.802964sec, 2.490772GB/s

real    0m5.355s
user    0m5.306s
sys     0m0.010s
fsb4000 ★★★★ ()
Ответ на: комментарий от anonymous
source last
replace::lut<uint8_t>: 1.951309sec, 1.024953GB/s
replace::lut<uint16_t>: 0.976562sec, 2.048001GB/s
replace::lut_core2<uint8_t>: 1.660348sec, 1.204567GB/s
replace::lut_core2<uint16_t>: 0.793160sec, 2.521559GB/s
replace::lut_core2_asm: 0.851266sec, 2.349442GB/s

real    0m6.262s
user    0m6.180s
sys     0m0.014s
replace::lut<uint8_t>: 1.951425sec, 1.024892GB/s
replace::lut<uint16_t>: 0.976055sec, 2.049065GB/s
replace::lut_core2<uint8_t>: 1.659124sec, 1.205455GB/s
replace::lut_core2<uint16_t>: 0.789864sec, 2.532081GB/s
replace::lut_core2_asm: 0.844855sec, 2.367270GB/s

real    0m6.228s
user    0m6.170s
sys     0m0.013s
replace::lut<uint8_t>: 1.945243sec, 1.028149GB/s
replace::lut<uint16_t>: 0.972595sec, 2.056354GB/s
replace::lut_core2<uint8_t>: 1.660357sec, 1.204560GB/s
replace::lut_core2<uint16_t>: 0.792465sec, 2.523771GB/s
replace::lut_core2_asm: 0.850776sec, 2.350795GB/s

real    0m6.227s
user    0m6.168s
sys     0m0.012s
fsb4000 ★★★★ ()
Ответ на: комментарий от anonymous

кстати, я сегодня узнал что Mac не может генерировать intel asm, вот что за тупость?

https://stackoverflow.com/questions/29460064/cannot-compile-c-program-with-gc...

Вот 22кб асма, которую сгенерировал gcc на маке: https://yadi.sk/d/aQR5y5hdkeRLSw

Может в 150 ассемблерных строчках функции

void replace::lut_core2<unsigned short>(char const*, char*):
будет что-то полезное...

fsb4000 ★★★★ ()
Ответ на: комментарий от fsb4000

Странно - почему же версия для коры2 в таком говне. Не должно так быть. Попробуй добавить -fno-unroll-loops, возможно он слишком занроллил и кеш поплыл.

Судя по всем вычислениям - оно должно давать куда больше.

anonymous ()
Ответ на: комментарий от anonymous

Ок, сейчас попробую.

Я собирал так:

cat build.sh
g++-9 -Ofast -march=native -fwhole-program -std=gnu++2a -lstdc++fs last.cpp -o last

Добавить 2 теста с -fno-unroll-loops и -funroll-all-loops?

fsb4000 ★★★★ ()
Ответ на: комментарий от fsb4000

кстати, я сегодня узнал что Mac не может генерировать intel asm, вот что за тупость?

Правильно - интел-синтаксис говна для питухов.

Вот 22кб асма, которую сгенерировал gcc на маке:

Да вроде всё нормально, но почему такое говно.

Попробуй:

perf stat -ddddddd ./prog

А хотя у тебя же нет перфа. Ну что-то подобное. Я сейчас вспомнил, что у меня валяется где-то нехалем, а там такая же проблема. Посмотрю как будет не лень - авось накапаю что.

Но в любом случае такого быть не может. Там не должно быть байт на такт. Ну вот никак.

Мануалы, мои подсчёты, подсчёты llvm-mca тоже. Всё говорит о том, что так быть не должно.

anonymous ()
Ответ на: комментарий от fsb4000

Добавить 2 теста с -fno-unroll-loops и -funroll-all-loops?

Попробуй.

Ну глянул asm - там анролл на 4 как нужно. С -funroll-all-loops оно анролит его на дохрена и я думал, что в этом проблема, но у тебя всё правильно.

anonymous ()
Ответ на: комментарий от anonymous
cat build.sh
g++-9 -Ofast -march=native -fwhole-program -funroll-all-loops -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 1.917564sec, 1.042990GB/s
replace::lut<uint16_t>: 0.961084sec, 2.080984GB/s
replace::lut_core2<uint8_t>: 1.608886sec, 1.243096GB/s
replace::lut_core2<uint16_t>: 0.754654sec, 2.650221GB/s
replace::lut_core2_asm: 0.807134sec, 2.477903GB/s

real    0m6.056s
user    0m6.039s
sys     0m0.005s
replace::lut<uint8_t>: 1.917701sec, 1.042915GB/s
replace::lut<uint16_t>: 0.959592sec, 2.084219GB/s
replace::lut_core2<uint8_t>: 1.609093sec, 1.242936GB/s
replace::lut_core2<uint16_t>: 0.757953sec, 2.638686GB/s
replace::lut_core2_asm: 0.808640sec, 2.473288GB/s

real    0m6.060s
user    0m6.041s
sys     0m0.006s
replace::lut<uint8_t>: 1.917122sec, 1.043230GB/s
replace::lut<uint16_t>: 0.960143sec, 2.083023GB/s
replace::lut_core2<uint8_t>: 1.606974sec, 1.244575GB/s
replace::lut_core2<uint16_t>: 0.752468sec, 2.657920GB/s
replace::lut_core2_asm: 0.807902sec, 2.475548GB/s

real    0m6.051s
user    0m6.037s
sys     0m0.005s
g++-9 -Ofast -march=native -fwhole-program -fno-unroll-loops -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 1.915119sec, 1.044322GB/s
replace::lut<uint16_t>: 0.959165sec, 2.085147GB/s
replace::lut_core2<uint8_t>: 1.631094sec, 1.226171GB/s
replace::lut_core2<uint16_t>: 0.781807sec, 2.558176GB/s
replace::lut_core2_asm: 0.843808sec, 2.370207GB/s

real    0m6.138s
user    0m6.121s
sys     0m0.005s
replace::lut<uint8_t>: 1.920456sec, 1.041419GB/s
replace::lut<uint16_t>: 0.964433sec, 2.073757GB/s
replace::lut_core2<uint8_t>: 1.627805sec, 1.228648GB/s
replace::lut_core2<uint16_t>: 0.779265sec, 2.566521GB/s
replace::lut_core2_asm: 0.844000sec, 2.369668GB/s

real    0m6.142s
user    0m6.126s
sys     0m0.006s
replace::lut<uint8_t>: 1.915204sec, 1.044275GB/s
replace::lut<uint16_t>: 0.963449sec, 2.075875GB/s
replace::lut_core2<uint8_t>: 1.629370sec, 1.227468GB/s
replace::lut_core2<uint16_t>: 0.778938sec, 2.567598GB/s
replace::lut_core2_asm: 0.842202sec, 2.374727GB/s

real    0m6.135s
user    0m6.120s
sys     0m0.005s
fsb4000 ★★★★ ()
Ответ на: комментарий от anonymous

С unroll-all-loops побыстрее вышло немного

А ,кстати, в https://benchmarksgame-team.pages.debian.net/ можно будет свои флаги задавать или ты только исходники им даешь и они свои стандартные флаги задают?

fsb4000 ★★★★ ()
Ответ на: комментарий от fsb4000

А ,кстати, в https://benchmarksgame-team.pages.debian.net/ можно будет свои флаги задавать или ты только исходники им даешь и они свои стандартные флаги задают?

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

Надо будет форкнуть это говно и забенчить на нормальном железе.

anonymous ()
Ответ на: комментарий от fsb4000

Проверь, пж. https://godbolt.org/z/b1oW5X - там на 32 битах он сам генерирует норм асм примерно как у меня, но у меня там говно между блоками.

anonymous ()
Ответ на: комментарий от anonymous
cat build.sh
g++-9 -Ofast -march=native -fwhole-program -fno-unroll-loops -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 1.948387sec, 1.026490GB/s
replace::lut<uint16_t>: 0.977564sec, 2.045902GB/s
replace::lut_core2<uint8_t>: 1.642514sec, 1.217646GB/s
replace::lut_core2<uint16_t>: 0.777749sec, 2.571524GB/s

real    0m5.377s
user    0m5.304s
sys     0m0.013s
replace::lut<uint8_t>: 1.946659sec, 1.027401GB/s
replace::lut<uint16_t>: 0.974520sec, 2.052292GB/s
replace::lut_core2<uint8_t>: 1.646028sec, 1.215046GB/s
replace::lut_core2<uint16_t>: 0.784643sec, 2.548930GB/s

real    0m5.359s
user    0m5.308s
sys     0m0.011s
replace::lut<uint8_t>: 1.949203sec, 1.026060GB/s
replace::lut<uint16_t>: 0.979009sec, 2.042882GB/s
replace::lut_core2<uint8_t>: 1.642329sec, 1.217783GB/s
replace::lut_core2<uint16_t>: 0.779826sec, 2.564675GB/s

real    0m5.356s
user    0m5.309s
sys     0m0.011s
cat build.sh
g++-9 -Ofast -march=native -fwhole-program -funroll-all-loops -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 1.940353sec, 1.030740GB/s
replace::lut<uint16_t>: 0.971897sec, 2.057831GB/s
replace::lut_core2<uint8_t>: 1.643518sec, 1.216902GB/s
replace::lut_core2<uint16_t>: 0.780538sec, 2.562335GB/s

real    0m5.344s
user    0m5.290s
sys     0m0.010s
replace::lut<uint8_t>: 1.947887sec, 1.026754GB/s
replace::lut<uint16_t>: 0.970470sec, 2.060857GB/s
replace::lut_core2<uint8_t>: 1.635846sec, 1.222609GB/s
replace::lut_core2<uint16_t>: 0.778569sec, 2.568815GB/s

real    0m5.339s
user    0m5.289s
sys     0m0.010s
replace::lut<uint8_t>: 1.939010sec, 1.031454GB/s
replace::lut<uint16_t>: 0.973983sec, 2.053424GB/s
replace::lut_core2<uint8_t>: 1.644994sec, 1.215810GB/s
replace::lut_core2<uint16_t>: 0.780852sec, 2.561305GB/s

real    0m5.345s
user    0m5.301s
sys     0m0.011s

На всякий случай создал ещё файл best.cpp и перепроверил результаты https://godbolt.org/z/bAR0b_

cat build_best.sh
g++-9 -Ofast -march=native -fwhole-program -funroll-all-loops -std=gnu++2a -lstdc++fs best.cpp -o best

sh bench_best.sh
source best
replace::lut<uint8_t>: 1.942798sec, 1.029443GB/s
replace::lut<uint16_t>: 0.973836sec, 2.053734GB/s
replace::lut_core2<uint8_t>: 1.631479sec, 1.225882GB/s
replace::lut_core2<uint16_t>: 0.765554sec, 2.612487GB/s
replace::lut_core2_asm: 0.814427sec, 2.455714GB/s

real    0m6.136s
user    0m6.078s
sys     0m0.012s
replace::lut<uint8_t>: 1.944987sec, 1.028285GB/s
replace::lut<uint16_t>: 0.974059sec, 2.053264GB/s
replace::lut_core2<uint8_t>: 1.642661sec, 1.217537GB/s
replace::lut_core2<uint16_t>: 0.761924sec, 2.624934GB/s
replace::lut_core2_asm: 0.816222sec, 2.450314GB/s

real    0m6.146s
user    0m6.083s
sys     0m0.012s
replace::lut<uint8_t>: 1.944417sec, 1.028586GB/s
replace::lut<uint16_t>: 0.972347sec, 2.056879GB/s
replace::lut_core2<uint8_t>: 1.632632sec, 1.225016GB/s
replace::lut_core2<uint16_t>: 0.759302sec, 2.633998GB/s
replace::lut_core2_asm: 0.820861sec, 2.436466GB/s

real    0m6.136s
user    0m6.078s
sys     0m0.012s

fsb4000 ★★★★ ()

Да это ж Цэ плас плас, чего там мерить — более тормозного языка не сыскать. Раст его с места рвёт.

anonymous ()
Ответ на: комментарий от anonymous
cat build.sh
g++-9 -Ofast -march=native -fwhole-program -funroll-all-loops -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 3.897593sec, 1.026274GB/s
replace::lut<uint16_t>: 1.944031sec, 2.057580GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.272804sec, 1.222194GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.526627sec, 2.620155GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.280178sec, 1.219446GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.570070sec, 2.547657GB/s
replace::lut_core2_asm: 1.633723sec, 2.448395GB/s
replace::lut_core2_asmv1: 1.628858sec, 2.455708GB/s
replace::lut_core2_asmv2: 1.614676sec, 2.477277GB/s

real    0m20.786s
user    0m20.194s
sys     0m0.032s
replace::lut<uint8_t>: 3.892446sec, 1.027631GB/s
replace::lut<uint16_t>: 1.959596sec, 2.041237GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.271236sec, 1.222779GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.528421sec, 2.617080GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.282236sec, 1.218681GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.576036sec, 2.538013GB/s
replace::lut_core2_asm: 1.633908sec, 2.448118GB/s
replace::lut_core2_asmv1: 1.627119sec, 2.458333GB/s
replace::lut_core2_asmv2: 1.615814sec, 2.475532GB/s

real    0m20.394s
user    0m20.210s
sys     0m0.032s
replace::lut<uint8_t>: 3.893612sec, 1.027324GB/s
replace::lut<uint16_t>: 1.946566sec, 2.054901GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.275458sec, 1.221203GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.526757sec, 2.619932GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.288181sec, 1.216478GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.581054sec, 2.529958GB/s
replace::lut_core2_asm: 1.634078sec, 2.447864GB/s
replace::lut_core2_asmv1: 1.630001sec, 2.453986GB/s
replace::lut_core2_asmv2: 1.688771sec, 2.368586GB/s

real    0m20.471s
user    0m20.230s
sys     0m0.036s
cat build.sh
g++-9 -Ofast -march=native -fwhole-program -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 3.892593sec, 1.027593GB/s
replace::lut<uint16_t>: 1.944837sec, 2.056728GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.274302sec, 1.221634GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.523983sec, 2.624701GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.279210sec, 1.219806GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.572203sec, 2.544201GB/s
replace::lut_core2_asm: 1.627737sec, 2.457399GB/s
replace::lut_core2_asmv1: 1.633836sec, 2.448226GB/s
replace::lut_core2_asmv2: 1.618639sec, 2.471212GB/s

real    0m20.375s
user    0m20.197s
sys     0m0.031s
replace::lut<uint8_t>: 3.902849sec, 1.024892GB/s
replace::lut<uint16_t>: 1.948641sec, 2.052713GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.276600sec, 1.220778GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.524180sec, 2.624362GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.289566sec, 1.215966GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.574486sec, 2.540512GB/s
replace::lut_core2_asm: 1.633064sec, 2.449383GB/s
replace::lut_core2_asmv1: 1.629481sec, 2.454769GB/s
replace::lut_core2_asmv2: 1.619021sec, 2.470629GB/s

real    0m20.404s
user    0m20.220s
sys     0m0.031s
replace::lut<uint8_t>: 3.893657sec, 1.027312GB/s
replace::lut<uint16_t>: 1.949953sec, 2.051331GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.278344sec, 1.220128GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.525518sec, 2.622060GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.280128sec, 1.219465GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.569299sec, 2.548909GB/s
replace::lut_core2_asm: 1.632648sec, 2.450008GB/s
replace::lut_core2_asmv1: 1.624460sec, 2.462357GB/s
replace::lut_core2_asmv2: 1.617102sec, 2.473561GB/s

real    0m20.377s
user    0m20.201s
sys     0m0.031s
cat build.sh
g++-9 -Ofast -march=native -fwhole-program -fno-unroll-loops -std=gnu++2a -lstdc++fs last.cpp -o last

sh bench_last.sh
source last
replace::lut<uint8_t>: 3.891419sec, 1.027903GB/s
replace::lut<uint16_t>: 1.952686sec, 2.048460GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.308255sec, 1.209097GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.591060sec, 2.514047GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.295075sec, 1.213933GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.566963sec, 2.552709GB/s
replace::lut_core2_asm: 1.684594sec, 2.374459GB/s
replace::lut_core2_asmv1: 1.643889sec, 2.433254GB/s
replace::lut_core2_asmv2: 1.614618sec, 2.477366GB/s

real    0m20.556s
user    0m20.374s
sys     0m0.032s
replace::lut<uint8_t>: 3.888414sec, 1.028697GB/s
replace::lut<uint16_t>: 1.954931sec, 2.046108GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.318040sec, 1.205531GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.591559sec, 2.513259GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.306865sec, 1.209605GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.567896sec, 2.551190GB/s
replace::lut_core2_asm: 1.695636sec, 2.358997GB/s
replace::lut_core2_asmv1: 1.647987sec, 2.427204GB/s
replace::lut_core2_asmv2: 1.621018sec, 2.467585GB/s

real    0m20.598s
user    0m20.421s
sys     0m0.032s
replace::lut<uint8_t>: 3.893074sec, 1.027466GB/s
replace::lut<uint16_t>: 1.953997sec, 2.047086GB/s
replace::lut_core2_uint64_t<uint8_t>: 3.316689sec, 1.206022GB/s
replace::lut_core2_uint64_t<uint16_t>: 1.589126sec, 2.517107GB/s
replace::lut_core2_uint32_t<uint8_t>: 3.295286sec, 1.213855GB/s
replace::lut_core2_uint32_t<uint16_t>: 1.573233sec, 2.542535GB/s
replace::lut_core2_asm: 1.690255sec, 2.366507GB/s
replace::lut_core2_asmv1: 1.650015sec, 2.424220GB/s
replace::lut_core2_asmv2: 1.623503sec, 2.463808GB/s

real    0m20.591s
user    0m20.406s
sys     0m0.031s
fsb4000 ★★★★ ()
Ответ на: комментарий от fsb4000

Спс, ну вообщем непонятно что ему нужно. Почему всё в таком говне. Без камня на руках хрен разберёшься. Забью пока что. Посмотрим что намериет автор, ведь никому другому кора2 нахрен не упёрлась. Надо хотя-бы на нехалеме запустить - сравнить с твоими цифрами. Авось будет тоже самое(а оно скорее всего будет).

Пока что использую lut_core2_uint32_t вариант везде. Добавлю многопоточность и всю фигню.

anonymous ()
Ответ на: комментарий от anonymous

Каково мнение цоря насчёт amd zen2?

anonymous ()
Ответ на: комментарий от anonymous

amd всегда был дристнёй. Как минимум нету нормальных доков. Если у интела я качаю мануал, то у амд жру дерьмо(а может ты поможешь мне найти мануал и я тебе подробнее скажу).

Судя по всему zen2 теперь стал ~= древнему хасвелу. Хотя после хасвела у intel ничего особо не изменилось. Поэтому это в какой-то мере адекватный проц, примерно равный интелу.

У интела есть их скайлейк, но там почти везде фейковые avx512(за исключением топов). Следующая итерация должна быть с нормальными avx512 и фронтом/agu. Если это будет, то zen2 превратится в тыкву. В том, что это будет в zen3 - крайне сомнительно.

Поэтому как обычный процессор он вполне адекватен. Если не сравнивать с интеловскими топами и до выхода новых интелов.

anonymous ()
Ответ на: комментарий от anonymous

Тем временем царь написал говнокод, который упал на бенчмарке с ошибкой работы с памятью

https://salsa.debian.org/benchmarksgame-team/benchmarksgame/issues/206

Segmentation fault (core dumped)

В этом прекрасно все.

Надо было писать на Rust

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 3)
Ответ на: комментарий от vertexua

Ты так и пытаешься бегать за мною, убогий?

Тем временем царь написал говнокод, который упал на бенчмарке с ошибкой работы с памятью

Это не ошибка работы с памятью, бездарность. Как оно работает на мусорном говне - никого не волнует. Никакой адекватный человек не будет использовать core2. Причём неясно какая там версия ядра.

Надо было писать на Rust

Почему же ты не написал? А те бездарности, что написали - валяются в говне и сливают?

anonymous ()
Ответ на: комментарий от anonymous

Никакой адекватный человек не будет использовать core2. Причём неясно какая там версия ядра.

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

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 1)

a1batross, баним не аккаунт, но человека? С каких пор такая херня творится?

LongLiveUbuntu ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

Вроде же запрещено создавать новые аккаунты после бана старых, создание виртуалов и тд. Хотя да, я правило найти не могу

vertexua ★★★★☆ ()
Ответ на: комментарий от vertexua

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

Чего же, клоун, не сидишь на дос-говне? Чего же, клоун, сидишь на ворованном llvm и ворованном рантайме, который как раз таки заточен под проц/ядро? А, клоун?

Корректный код - также портабельный.

Нет, клоун. Корректный и качественный код не может быть портабельный.

К тому же, клоун. Почему же твоё раст-говно не портабельное и хомячьё просит постоянно определённую версию рантайма?

Ты - бездарный говнокодер. Иди посыпать голову пеплом.

Я тебе задал вопрос. Почему ты не сделал и почему подобные тебе клоуны ничего не сделали?

Люди в этой теме спокойно бенчили мой код и никак ни у кого он не падал. А то, что у какого-то там инвалида что-то упало - это его проблема.

anonymous ()
Ответ на: комментарий от anonymous

который как раз таки заточен под проц/ядро?

Заточен на нужное количество ядер, а на других не падает. Твой говнокод упал у первого человека, с которым ты поделился. С одним согласен - это настоящий код С++, у него есть все нужные свойства - например падать с коркой.

Корректный и качественный код не может быть портабельный.

Бвахаха, да ты полный нуль в программиронии. Тебя хоть к одному проекту на пушечный выстрел допускали?

Люди в этой теме спокойно бенчили мой код и никак ни у кого он не падал

Код не корректный - бенчмарком не считается. Это мухлеж чистой воды. Только корректный код отображает производительность ЯП

А то, что у какого-то там инвалида что-то упало - это его проблема.

Истинного плюсовика ответ.

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

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от vertexua

С одним согласен - это настоящий код С++, у него есть все нужные свойства - например падать с коркой.

Остаётся вопрос. Зачем ты воруешь этот код, клоун? Почему твоё говно на 99% состоит из С++? Как ты с этим живёшь, вор нелепый?

Повторю ещё раз вопрос, клоун. Я тебе уже макал у меня в комментах, макну ещё раз. Кстати, чего зассал ныть на лоре?

Почему у тебя ничего нет? почему у подобных тебе сектантов ничего нет? Как так вышло?

anonymous ()
Ответ на: комментарий от anonymous

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

Итого, ты побежал shootout фиксить, обосрался по шею. Что и требовалось доказать. А когда оно запустится, то будет медленнее жабы

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

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

Клоун, ты обделался. Почему ты в говне? Если такты тебе ненужны, то зачем ты воруешь?

Итого, ты побежал shootout фиксить, обосрался по шею. Что и требовалось доказать. А когда оно запустится, то будет медленнее жабы

И того - я уже победитель. Меня не интересуют бенчмарки говна от идиотов я уже заранее это говорил. Если идиот не может собрать так как ему сказали, то это его проблема.

К тому же, побежал доказывать, что проблема есть. Твоя задача воспроизвести ошибку. До этого - ты трепло бездарное и выдаёшь факапы клоуна из интернета за что-то объективное.

anonymous ()
Ответ на: комментарий от vertexua

Самое интересное тут то, что он показывает результаты и результаты там верные. Т.е. программа работает и выдаёт правильные результаты.

Это настолько смешно, смешно то как ты обделался, клоун.

anonymous ()
Ответ на: комментарий от anonymous

Значит ты засрал стек и на выходе из какой-то функции очистка валит програму. Вывод - ты рукожоп.

vertexua ★★★★☆ ()
Ответ на: комментарий от vertexua

Значит ты засрал стек и на выходе из какой-то функции очистка валит програму.

Каким образом очистка может валить программу? Там ничего динамического/раишного нету.

Если оно отработало верно, то значит оно дошло до

write(STDOUT_FILENO, buff, buff_it - std::begin(buff));

И прошло

replace(data)

Значит, что оно либо падает на высвобождении вектора index, либо в сам index оно напарсило больше, но шансы на это крайне малы.

Как максимум write может читать криво, но адепт не положил нормальный дамп(опять же вина идиотов, которые не могут дать норм инфу). Судя по его выхлопу - там кроме '\n' ничего нет. Значит replace(data) завершилось нормально.

Таким образом адепт сам что-то напортачил, либо его рантайм дырявый.

Вывод - ты рукожоп.

Вывод - ты обделался, клоун. Как и всегда.

anonymous ()
Ответ на: комментарий от anonymous

Таким образом адепт сам что-то напортачил, либо его рантайм дырявый.

Каким боком, рукожоп? У него целая убунта 19я работает и ничего не падает, только твоя програмулина на 100 строчек свалилась в корку.

Была бы у него какая-то жопа в libс, он бы тебе на коммент не мог бы ответить.

Факт есть фактом, все рухнуло к чертям, чего бы не случилось в Rust. Тем более на коде такого размера, который массивчики дергает туда сюда

Вывод, ты - рукожоп. Побежал фиксить или ты обосрался

vertexua ★★★★☆ ()
Последнее исправление: vertexua (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)