🦥Alex Fails
Racoon
Добрый вечер. Есть код
for (int i = 0; i <l1; i++)
{
for (int j = i + 10; j <l1; j++)
{
roro = 0;
for (int ii = 0; ii < l2; ii++)
{
for (int jj = 0; jj < l3; jj++)
{
var temp = (z[i][ii][jj] - z[j][ii][jj]);
roro += temp * temp;
}
}
}
}
double ***z = new double**[l2];
Реализовано на C# и С++, но почему-то на первом работае быстрее. Может дело в флагах компиляции?
Berkus
Aidar
вангую непопадания в кэш а поди в шарпе это какойнить tightly packed array
Berkus
нам не сказали насколько быстрее, может это просто debug-build-vs-release-build
Racoon
оба в состояния релиза
Racoon
9 мс и 22 мс
Racoon
флаги ищу.
Racoon
да
Berkus
ну может и кэш, а флаги еще интересно посмотреть и векторизацию
Aidar
не правда
Aidar
нормальный компилятор бы выкинул этот код полностью тогда
Aidar
если он не учавствует в сайдэффектах
Matwey
да
А чему равны l1 l2 l3?
Racoon
на моем примере 26000 1 1
Ioann_
В кеш оно б должно попадать
Ioann_
Не вижу причин не попадать.
Racoon
я работаю через студию
/Yu"stdafx.h" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\FNN.pch" /diagnostics:classic
вроде это влаги
Ioann_
На счет new, разве что могут быть проблемы
Aidar
это не си++
Aidar
Racoon
double temp = (z[i][ii][jj] - z[j][ii][jj]);
Ioann_
Berkus
Matwey
И получается валидный C++
Ioann_
Berkus
ну я подозревал что там больше бесмыссленно
Aidar
на моем примере 26000 1 1
>double ***z = new double**[l2];
и при этом for (int i = 0; i <l1; i++)
и emp = (z[i][ii][jj] - z[j][ii][jj])
Aidar
Racoon
https://pastebin.com/XRrLBVjD
https://pastebin.com/Kja4bnUP
Berkus
Berkus
компилер сам это может
Constantine
Racoon
ставила точки останова
Constantine
22мс это порядка разрешения таймера
Constantine
запуск в visual studio под отладчиком приводит к замедлению аллокаций памяти
Racoon
пардон секунд.
Racoon
это данные из файла
Aidar
почему у тебя массив до l2 а заполняешь ты его до l1
Matwey
Constantine
/fp:precise
Ioann_
пардон секунд.
Погоди. А ты вот эти все new что скинул на пастебин, тоже замеряешь ?
Constantine
вам точно нужно fp:precise?
Berkus
Berkus
по идее vectorizer включен по дефолту, но может он чего не смог
Ioann_
Или что то этом духе.
Berkus
Racoon
да там ошибка л1 должно быть, тогда будет еще дольше работать
Constantine
и да, такой вопрос
Berkus
там аллокатор действительно проще и быстрее
Ioann_
Ну я знаю. Вот я и читал, что там операции new даются быстрее. Да.
Constantine
нагруженный аллокатор надо измерять без вижака всегда
Constantine
вижак когда аттачится, видимо, переключает отладочные флаги кучи
Constantine
и да, такой вопрос
и да, такой вопрос: вы же считаете АКФ, вы понимаете, что она считается через Фурье при больших l1?
Racoon
Оказалось это студия некоректно реагировала на ту ошибку с л1.
Racoon
Исправила выполнение оклоко секунды
Constantine
?
Racoon
не вылетала ошибка о том, что не выделено место, а просто работал код с муссором
Constantine
for (int k = 0; k < m; k++)
Constantine
это тоже выглядит как ошибка)
Aidar
Constantine
угу, релиз санитайзить не будет
Constantine
и в любом случае написан расчет АКФ
Berkus
Constantine
хех, оукей
шланг бы оптимизировал в return 42, да
Berkus
так там memory allocation в динамике фейлился или чо?
Constantine
там был индекс перепутан
Constantine
лень разбираться, overrun или underrun
Berkus
если назвать переменные i, l, j, ii, ll, jj, iii, lll, jjj то рано или поздно в них запутаешься
Constantine
ну i, j, k и sz1, sz2, sz3 не должен запутаться
Constantine
а вообще второй отстрел мозга паскаль-олимпиадников это что j0 в глобале нельзя
Constantine
я просто там дефайны видел