Мне дали 2D матрицу, представляющую температурные точки на поверхности металлической пластины. Края матрицы (пластины) удерживаются постоянными при 20 градусах Цельсия, и в одной предварительно определенной точке имеется источник постоянного тепла в 100 градусов Цельсия. Все остальные точки сетки изначально установлены на 50 градусов Цельсия.
Моя цель состоит в том, чтобы взять все внутренние точки сетки и вычислить ее установившуюся температуру путем итеративного усреднения по окружающим четырем точкам сетки (i + 1, i-1, j + 1, j-1), пока я не достигну сходимости ( изменение менее 0,02 градуса C между итерациями).
Насколько я знаю, порядок, в котором я перебираю точки сетки, не имеет значения.
Для меня это звучит как прекрасное время для вызова конструкции Fortran FORALL
и изучения радостей распараллеливания.
Как я могу убедиться, что код действительно распараллеливается?
Например, я могу скомпилировать это на своем одноядерном PowerBook G4, и я не ожидаю улучшения скорости из-за распараллеливания. Но если я скомпилирую на двухъядерном AMD Opteron, я предполагаю, что конструкция FORALL может быть использована.
В качестве альтернативы, есть ли способ измерения эффективного распараллеливания программы?
Обновление
В ответ на вопрос М.С.Б. это с gfortran версии 4.4.0. Gfortran поддерживает автоматическую многопоточность?
Примечательно, что конструкция FORALL устарела, как я полагаю, благодаря автоматической векторизации.
Возможно, это лучше всего для отдельного вопроса, но как работает авто-векторизация? Может ли компилятор обнаружить, что в цикле используются только чистые функции или подпрограммы?