Векторизация связанного списка в Fortran - PullRequest
0 голосов
/ 17 декабря 2018

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

Теперь эти точки данных наиболее удобно хранить в Fortran как связанный список, поэтому удаление / добавление является простым.Тогда основной цикл будет выглядеть примерно так:

do while(associated(data_points)) 

     data_points => data_points% next
       ......
enddo 

Как это работает с векторизацией?

Другой вариант - сохранить все переменные в объявленном объявленном типе и выделить массив этого типа, равный количеству точек данных, например:

type(type_data_points) :: data_points(1:no_data_types)

, а затем сделать-loop будет просто

do i = 1, no_data_types 
    data_points(i)% x = (...) 
    data_points(i)% y = (...) 
     ....
enddo

Будет ли даже последний векторизован - и какие у меня есть варианты, кроме определения каждой переменной (x,y, ...) в виде массивов no_data_points и выполнения вычислений.

1 Ответ

0 голосов
/ 06 января 2019

Помимо того, что вы уже упомянули в вопросе, можно рассмотреть следующие варианты:

  1. deallocate и allocate массив при каждом добавлении точки данных илиудалено.

  2. Объявление массива, который намного больше ожидаемых данных, и отслеживание количества добавленных точек данных.Затем вы можете выполнить математику на самом отрезанном массиве.Ожидается, что это даст очень хорошую производительность.Если вы попали в точку, где вам нужен больший массив, вам, возможно, придется снова набрать deallocate и allocate.Это требует меньшего количества выделений, чем раньше, поэтому более чистый вариант.

  3. Нестандартное расширение языка, как предлагается здесь .

Имеющаяся у вас структура данных связанного списка тоже в порядке, но при параллелизме с MPI необходимо учитывать.Связь с массивами намного эффективнее и удобнее.Поскольку данные независимы, и вы намереваетесь выполнять операции независимо, я предполагаю, что вам также понадобятся все собранные данные снова.В случае связанного списка, вам, возможно, придется сначала собрать все данные для связи в буфере, а затем отправить / получить / все собраться.Однако, если он уже структурирован в массиве, это гораздо проще.

...