Анон, как мы знаем, двач полон программистов 300кк/наносек. Помогите решить задачу. Нужно вычислить значение суммы интегралов Френеля (два интеграла, от sin(x^2) и cos(x^2) соответственно) на отрезке от нуля до входного Х. Точность - до пятого знака включительно. Ограничения по времени - анальные. Попробовал метод бесконечного количества бесконечно малых прямоугольников - не укладываюсь во время: нужная точность достигается при 200 млн прямоугольников, а за заданное время успеваю обработать только около 16 млн. Вот код:
double x; cin >> x; double cap = 200Math.pow(10,6); double length = x/cap; double sum = 0.0; double i = length/2; while (i<x) { double pow = ii; sum = sum + length (Math.sin(pow)+Math.cos(pow)); i = i + length; } write((Math.ceil(sum Math.pow(10, 5)) / Math.pow(10, 5))+"");
Плюс стоит описать измерение времени. Что измеряется? Системное время, кол-во циклов*частоту? Большинство таких оценок - полное гавно, ибо планировщик успеет сто раз переключить твои задачи, и в эти измерения времени вкрадутся чужие расходы. В идеале мерять надо на выделенном ядре, где шедулер не ебет таски, kernel скомпилировать с NO_HZ_FULL и добавить на нужное ядро эту опцию + isolcpu. И запускать свой таск с SHED_FIFO и максимальной rt-шной привелегией.
>>165490516 Почитай хоть пару строк про avx и simd вообще, дебил малолетний.
В современных процах есть специальные регистры, длинной например 256 бит, куда помещается например 8 32-битных интов или 4 дабла и много других вариантов, вплоть до 32 байт. Для работы с этими регистрами есть специальный набор инструкций, современные называются AVX/AVX2/AVX-512 (это уже на совсем современных, где есть регистры на 512 бит). Эти инструкции позволяют производить одновременные операции над числами в векторном регистре за одну инструкцию. Для удобства для этих инструкций определены интринсики, в <immintrin.h>, можно писать внутри си/си++ программ.
>>165490954 Если ты пишешь код не для rt-систем - то пожалуйста, вставляй флаги и жди, что компилятор что-то сделает за тебя. Но компилятор векторизует только довольно примитивные случаи, и зачастую делает это криво и неполноценно. Программист зачастую умней компилятора и способен написать крайне эффективный код на avx2, который компилятору не повторить из-за сложного алгоритма.
>>165491288 >%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D1%8B_%D0%A4%D1%80%D0%B5%D0%BD%D0%B5%D0%BB%D1%8F бляяяяяяяяяяяяяяяяяяяяяяяя ну ты и петух
>>165492088 У рунге-куты или трапециями точность значительно выше, чем у прямоугольников при том же шаге. Там где прямоугольниками надо 200млн шагов, рунке-кута или трапеции за сотню тысяч или даже десятков сделают.
Аноны, а вы можете дать оценку сложности алгоритмов с прямоугольниками, трапециями, параболами, рунгекуты, разложения в ряд и асимптоматики в зависимости от x и в зависимости от требуемой точности?
>>165489990 (OP) > за заданное время успеваю обработать только около 16 млн. Неси этот код. На все претензии отвечай, что у тебя всё работает просто они лохи и дураки пидары и гамасеки а ещё суки ебаные, на доисторическом дерьме запускают код.
>>165493688 Анон, если ты шаришь, поясни за ту хуйню которую тот анон, на которого ты отвечаешь, несёт. Я нихуя не понял. Это торт или хуита? И почему? Только объяснение хорошо бы уровня для дебилов
>>165493806 Тот ебалай предлагает тебе заебенить код с командами ассемблера. На первый взгляд это кажется круто, но явно не в твоём случае т.к. это будет охуительный костыль. Принесёшь ты этот код на другую машину и начнётся веселуха. Хуякс, а проц на целевой машине эти команды не поддерживает и вообще там стоит MIPS. Там один гражданин ответил уже, что всё это делается средствами компилятора.
Помогите решить задачу.
Нужно вычислить значение суммы интегралов Френеля (два интеграла, от sin(x^2) и cos(x^2) соответственно) на отрезке от нуля до входного Х.
Точность - до пятого знака включительно. Ограничения по времени - анальные.
Попробовал метод бесконечного количества бесконечно малых прямоугольников - не укладываюсь во время: нужная точность достигается при 200 млн прямоугольников, а за заданное время успеваю обработать только около 16 млн.
Вот код:
double x;
cin >> x;
double cap = 200Math.pow(10,6);
double length = x/cap;
double sum = 0.0;
double i = length/2;
while (i<x) {
double pow = ii;
sum = sum + length (Math.sin(pow)+Math.cos(pow));
i = i + length;
}
write((Math.ceil(sum Math.pow(10, 5)) / Math.pow(10, 5))+"");
Знаю, что хуйня, обоссывайте, но помогите.