Andrey_KireewЗапускайте программу в трёхпоточном режиме, чтобы одно ядро всегда было свободным (на нужды ОС или других фоновых процессов).
Проверьте что все эти непоказанные циклы for не зависят от входных данных в массивах, кроме как от переменной L (кажется она задаёт длину массивов). Можно даже инициализировать входные массивы откровенным бредом (но неизменным от запуска к запуску!) и проверить что будет со временем выполнения.
Насыпьте больше разнообразных счётчиков в код, хоть прямо в каждый цикл и if (во все ветки). Сравните что показания счётчиков постоянны при значительном изменении времени (десяток процентов времени игнорировать). Сравните что показания счётчиков (видимо в сумме) не зависят от коэффициента разбития задачи. Найдёте скачущий счётчик — выдумывайте и проверяйте причины.
Раз записи не влияют - комментируйте куски вычислений с конца и ищите в какой момент время перестанет скакать. Надеюсь "пустой" код, без ваших вычислений, работает правильно (стабильно по суммарному времени от запуска к запуску и вне зависимости от количества потоков и разбиения задачи).
Оцените общий объём читаемых данных из памяти всеми потоками (например в однопоточном режиме), сравните со скоростью памяти (если не знаете точно можно принять 10ГБайт/с). Если память окажется медленнее, то проверьте что чтения выполняются
предсказуемо (например последовательно, или с постоянным шагом) хотя бы для большинства обращений. И что шаг при этом не кратен 32768 (длина одной страницы кэша L2, чтобы хватало его ассоциативности). Для произвольных чтений считайте каждое из них за 64 байта независимо от фактической длины переменной. Это всё чтобы убедиться что тормоза не из-за памяти и кэша.
Кажется уже предлагал запускать потоки строго последовательно, дожидаясь завершения предыдущего, перенеся WaitForSingleObject внутрь цикла for запуска потоков, не помню результата (есть ли скачки времени).
А, да,
обязательно проверьте что нет неинициализированных переменных или массивов! Что все они обязательно чем-то пишутся перед первым чтением. Это должен сообщать компилятор, вам говорили исправить все (хотя бы такие) ошибки и предупреждения. И не надейтесь на обнуление при объявлении. Это легко даст самое удивительное поведение программы.
Это же всё "общие" слова, но что ещё можно советовать "за глаза" то ...
И сразу у всех прошу прощения что предлагаемые методы отладки столь низкоуровневые, не привык к хорошему.