Как стать автором
Обновить
44
0

Пользователь

Отправить сообщение
Круто завернул, товарисч. И не поспоришь и не буду.
Отмечу, что pinc — это всего лишь инструмент. Если есть идеи как сделать «правильный» на ваш взгляд тест — добро пожаловать. Новый тест легко добавить.
Хватит критиканствовать! Как правильно?

Еще раз по пункту два: «собираем результаты N запусков, формируем выборки, вычисляем характеристики распределений и доверительные интервалы, если угодно»

И спасибо за звание бенчмарка. Звучит. :)
Вот жеж взъелись :). По второму пункту: берете тест запускаете его N раз, формируете выборки, выбираете критерии — вычисляете доверительные интервалы. Получите статистическое исследование.
Факториал ста слишком велик. Поэтому приходится обходится малым и надеяться, что погрешность не будет слишком велика.
Пробовал находить наименьшее общее кратное всех n меньше N, но все равно получается почти факториал по скорости возрастания.
Раскрутка цикла имеет значение только для последовательной версии. Для параллельных версий, в цикле блокировки стоят или последовательно, значение не имеет.

Также и с кэшем. Замечание правильно, только для последовательной последовательного случая и случая, когда несколько нитей выполняются на одном процессоре. Для нескольких нитей, работающих на нескольких процессорах кэш влиять не будет т.к. каждая операция с переменной потребует обращения к глобальной памяти.

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

Далее:
1. Про графики спорить не стану. Мне так больше нравится.

1а. При измерений кол-ва операций в секунду слишком большие числа получаются, да и переносимого средства нет, чтобы эти операции считать(знаю только rdtsc) поэтому миллисекунды.

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

3а. Время измерения каждой точки, указано на оси ординат. Влияние шедулера не исключается.

3б. Возможно, с какой-то точки зрения, правильнее, твердо утверждать не могу, но в этой версии сделано так.

4. 100 тредов т.к. вспомнил про 80 ядерные серверы. Ну ещё, на большом количестве нитей могла нарушаться линейность. Теперь, ясно, что до ста нитей все более-менее линейно, кроме спинлоков.

5аб. Чтобы избежать влияния асинхронности старта выбирается достаточно большое «большое число». Условие достаточности — интуиция. Да, не научно :). Где-то читал, что старт нити занимает десять микросекунд, т.к. максимальная рассинхронизация при ста нитях — 1мсек. Примерно 1 тысячная среднего замера. С процессами финализаци аналогично. Возможно вам известны другие способы борьбы с переходными процессами, рад буду узнать.

На мой взгляд, Вашим единственным серьезным доводом против теста является отсутствие статистической обработки результатов. Однако, спасибо за потраченное время.
сейчас проверил на другой машине — не работает, т.к. там другой порядок расположения переменных в стеке.
Посмотрел, спасибо, там, как раз самое интересное оказывается :)
Сделал небольшой стековерфло :). В тексте тоже подправлю.
#include <stdio.h>

void **ret;
void *leave;

void foo(){
    void (*boo)(void); //указатель на функцию
    printf("Stack rewrite!\n");
    boo = (void (*)(void))leave; 
    boo(); // fini()
}

int main(int argc, char *argv[], char *envp[]) {
   int a[123] = {0};
   unsigned long int mark = 0xbfbfbfbfbfbfbfbf; //метка, от которой будем работать
   ret = (void**)(&mark+2); // извлекаем адрес, функции, вызываемой после завершения (fini)
   leave = *ret;             // запоминаем  
   *ret = (void*)foo;       // перетираем
   return 0;                // вызов функции foo()
}
Спасибо, поправил в тексте.
Вместо Denwer читать, конечно же, Darwin.

Информация

В рейтинге
Не участвует
Откуда
Саров (Нижегородская обл.), Нижегородская обл., Россия
Зарегистрирован
Активность