Поведение odeint make_zip_iterator с make_tuple, когда векторы аргументов имеют разный размер

При использовании odeint с тягой я разрабатываю наблюдатель, который будет генерировать гистограмму переменных состояния, параллельно решая множество проблем с начальными условиями.

Проблемы с начальными условиями выполняются параллельно, заполняя device_vector такими данными.

Trajectory 0, Variable 0, Histogram Bin 0;
Trajectory 0, Variable 0, Histogram Bin 1;
...
Trajectory 0, Variable 1, Histogram Bin 0;
Trajectory 0, Variable 1, Histogram Bin 1;
...
Trajectory 1, Variable 0, Histogram Bin 0;
Trajectory 1, Variable 0, Histogram Bin 1;
...

Или, выражаясь более кратко, индексация массива будет рассчитываться в соответствии с:

trajectoryIndex*N_BINS*N_VARS +varIndex*N_BINS +binIndex

... и позже этот вектор будет сведен к одной гистограмме для каждой переменной.

Парадигма, которую я видел в odeint + тяге, состоит в том, чтобы функтор оператора вызывался с использованием make_zip_iterator и make_tuple тяги, таким образом:

thrust::for_each(
    thrust::make_zip_iterator(
        thrust::make_tuple(
            boost::begin( x ) + 0*m_N,
            boost::begin( x ) + 1*m_N
        ),
    thrust::make_zip_iterator(
        thrust::make_tuple(
            boost::begin( x ) + 1*m_N,
            boost::begin( x ) + 2*m_N
        ),
    observer_functor()
);

который прекрасно работает, когда все аргументы функтора имеют одинаковую длину. Но в моем случае device_vector данных гистограммы, который должен быть заполнен, как описано выше, имеет другой размер и должен быть проиндексирован иначе, чем другие аргументы, переданные функтору (например, переменные состояния).

Немного осмотревшись, я думаю, что лучший способ сделать это — передать thrust ::counting_iterator, который предоставляет функтору индекс траектории, необходимый для заполнения матрицы гистограммы. Затем я также (очевидно) должен был бы каким-то образом предоставить указатель на матрицу гистограммы, чтобы ее можно было заполнить. Возможно, лучшим решением для предоставленияObserver_functor указателя на вектор гистограммы было бы предоставление его в качестве аргумента конструктору наблюдателя (аналогично решению еще один вопрос, который я разместил здесь).

Все это вызвало некоторую путаницу в отношении того, как работают массивы в приведенной выше парадигме make_zip_iterator/make_tuple, когда переданные аргументы указывают векторы разной длины.

ВОПРОСЫ:

  1. Является ли предлагаемое мной использование thrust::counting_iterator и передача указателя на выходной массив через конструктор объекта функтора рекомендуемым подходом?

  2. В более общем плане, как работает описанная выше парадигма make_zip_iterator/make_tuple, когда переданные аргументы указывают векторы разной длины?


person weemattisnot    schedule 08.09.2014    source источник
comment
Ваша проблема больше похожа на сокращение или один из его вариантов. Посмотрите документацию Thrust, там много примеров.   -  person headmyshoulder    schedule 09.09.2014
comment
Еще вопрос: нужно ли хранить данные бина? Разве недостаточно вычислить номер ячейки для каждой переменной на каждой траектории? Следовательно, вы можете иметь преобразование, которое отображает trajectory_i и variable_j на текущий бин, который является просто целым числом. Наконец, вам нужно уменьшить все ячейки в окончательную гистограмму.   -  person headmyshoulder    schedule 09.09.2014
comment
Вы правы в том, что в этой проблеме есть сокращение (я упоминаю об этом в вопросе). Но сокращение происходит в конце сбора всех данных гистограммы. (по крайней мере я так делаю). Я не уверен, что понимаю ваш второй комментарий, но, возможно, это проясняет ситуацию: цель состоит в том, чтобы подсчитать общее количество шагов, которые каждая переменная прошла в каждой из своих ячеек. Если у меня есть 10 бинов для каждой переменной и 2 переменные, у меня будет в конце 20 значений, а не 100. Мой вопрос выше касается наилучшей практики обращения к индексу траектории из функтора.   -  person weemattisnot    schedule 09.09.2014
comment
Хм, я не понимаю, что означает третий столбец в вашем макете данных. Я бы ожидал, что traj0, var0, binnumber; трассировка0, переменная1, номер бина; трассировка0, переменная2, номер бина; ...; дорожка1, переменная0, номер бина, ...   -  person headmyshoulder    schedule 09.09.2014
comment
Каждая строка представляет одну точку данных в векторе, а третий столбец, как вы написали, представляет собой номер ячейки.   -  person weemattisnot    schedule 09.09.2014
comment
Разве тогда индексация не должна быть trajectoryIndex*N_VARS +varIndex. Зачем вам нужен индекс бина в этом макете данных?   -  person headmyshoulder    schedule 10.09.2014
comment
Нет, мне нужно вести подсчет количества итераций каждой переменной в каждой корзине.   -  person weemattisnot    schedule 10.09.2014