2016-01-18 1 views
1

У меня есть код, в котором используется одномерный массив R, который имеет 3N элементов. Вы можете представить это как вектор положения частиц N, например R=[r1x,r1y,r1z,r2x,r2y,...]. Обратите внимание, что шаблон должен быть определен как это для краткого использования массива.Выполнение несмежного массива указателей, указывающих на одномерный целевой массив в fortran

В разделах кода мне нужно выполнить некоторые операции только по координатам x. Я в настоящее время использую что-то вроде этого:

Rx => R(1:3N-2:3) 

и Rx впоследствии используется в операциях. Это делает доступ несмежным, но мне было интересно, могу ли я надеяться на способ векторизации операций. В качестве альтернативы можно использовать OMP с петлей над частицами. Я хочу получить экспертную идею по этому вопросу и, в частности, наилучшую практическую работу.

+0

Пожалуйста, используйте тег [tag: fortran], только несколько человек следуют fortran2008. –

ответ

4

Вы не можете иметь свой торт и съесть его тоже. Если вы хотите сделать плавный доступ к несмежным элементам массива, вы будете платить цену за производительность. Для небольших массивов, в которых все элементы вписываются в кеш, вы, вероятно, никогда не заметите цену. Для больших массивов вы будете делать намного больше движения данных через кеш, чем если бы каждый шаг по элементам массива выполнялся один за другим в порядке макета памяти. Использование указателей для несмежных разделов массивов не волшебным образом изменяет эти факты (как вы, кажется, знаете).

Так что вы делаете то, что программисты Fortran всегда делали, оптимизируйте макет памяти ваших массивов для наиболее распространенного шаблона доступа. В вашем случае у многих из нас был бы либо массив 3,x rank-2, либо x,3 один в зависимости от того, был ли доступ ко всем элементам x (или y или z) более частым, чем доступ к частичным по частям.

Иногда стоит переносить массив до операций над элементами в порядке расположения без памяти. Иногда даже стоит держать одни и те же данные дважды, один раз в одном порядке, один раз в другом. Но вам нужно будет выяснить, что является лучшим решением для вашей программы, у нас нет всех фактов, необходимых для предоставления высококачественной рекомендации. Если это имеет для вас значение, то для вас достаточно важно провести некоторые тесты и разработать количественное представление об этой ситуации.

Вы платите свои деньги, и вы делаете свой выбор.

+0

Спасибо, Марк. В вашем ответе есть полезные советы. Факт в моем коде состоит в том, что макет (3, :) является обязательным, так как самые большие операции масштабирования выполняются с глобальным вектором R. Я не уверен, что я получу правильный вывод из вашего первого абзаца, поэтому указатель Rx для большого R было бы полезно отправить большой кусок массива в кеш, что приведет к лучшему использованию кеша? – Amir

+0

И нет никакой конкретной рекомендации по выбору элементарных операций (распараллеливается с использованием OMP) или указателя, указывающего на непересекающийся раздел. Кроме того, я также хотел убедиться, что в Rx не будет никакой автоматической векторизации, как я уже упоминал в исходном вопросе. еще раз спасибо. – Amir

+0

* поэтому указатель Rx на большой R будет иметь преимущество отправки большого куска массива в кеш. * Я неправильно понимаю вас, или вы меня неправильно понимаете. Когда ячейка памяти загружается для кэширования, загружается целая строка в ячейке памяти (одна из ссылок и ее соседние). Количество загружаемых файлов зависит от размера строки кэша. Если ваш массив выложен, как вы показываете нам, и ваш указатель Rx указан так, вы будете читать примерно в 3 раза больше строк в кеше, чем если бы Rx указывал на непрерывную память. –