PD>Рассмотрим следующую ситуацию PD>Надо пропустить достаточно большое количество задач, каждая из которых выполняет большое количество арифметических операций. Иных действий в задачах нет.Все данные для всех задач уже размещены в ОП. Всего задач N, причем К типов , каждого типа nk задач. PD>Например, надо 100 раз произвести обращение матрицы, 50 раз вычислить сумму ряда и 200 раз обработать некое графическое изображение. Тогда N=350, K=3, n1 = 100, n2 = 50, n3 = 200. PD>Задачи независимы и выполнять их можно в любом порядке. PD>Цель — пропустить все задачи за минимальное астрономическое время. PD>Выполнение производится на машине с C-ядерным процессором (будем считать C=4) PD>Никакие другие "тяжелые" вычисления на машине не производятся, так что загрузка процессора другими процессами близка к 0.
Выяснить, какие задачи из смеси к какому кешу обращаются можно только на основе реального отслеживания.
Как это отслеживать и можно ли — хрен знает, не интересовался.
Мой опыт такой.
Писал я задачу моделирования перколяционных процессов.
Матрицы там большие, 10000х10000 — это маленькая.
На моей 32-битной машине удалось достичь 40000х40000
Вторая засада — моделирование методом монте-карло.
Процесс повторяется от 1000 раз (а лучше 10000) и собирается полная статистика.
Естественно, я пытался выжать из 1 прогона максимальную скорость.
И вот заметил, что обработка матрицы по горизонтали в 4 (четыре) раза быстрее, чем по вертикали.
Сообразил, что это зависит от кеша.
Простое решение ускорило работу в 3 раза.
Просто предварительно переписал столбец в вектор.
Поэтому даже отслеживание мало что даст.
Ну, будет задача тормозиться по смене кеша.
И что с этим делать?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!