Как мне изменить порядок вектора во время преобразования тяги?

#cuda #nvidia #thrust

#cuda #nvidia #тяга

Вопрос:

Как я мог бы преобразовать этот простой код в исходный код?

 for (i=0;i<cA-rA;i  )
    sn[i]=c[n_index[i]]-sn[i];
  

Подробная информация:
cA и rA являются постоянными целыми числами, поэтому мы можем считать, что ‘n’ = cA-rA
sn : массив float(n)
n_index : массив int(n)
c : массив с плавающей запятой (cA)

Моя проблема связана с n_index[i], который указывает на элемент массива C. Спасибо!

Ответ №1:

Вы можете реализовать это путем объединения thrust::transform с операцией «gather» с помощью permutation_iterator :

 #include <thrust/device_vector.h>
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/transform.h>
#include <thrust/sequence.h>
#include <thrust/functional.h>

int main()
{
  size_t n = 100;

  // declare storage
  thrust::device_vector<int> sn(n);
  thrust::device_vector<int> n_index(n);
  thrust::device_vector<int> c(n);

  // initialize vectors with some sequential values for demonstrative purposes
  thrust::sequence(sn.begin(), sn.end());
  thrust::sequence(n_index.begin(), n_index.end());
  thrust::sequence(c.begin(), c.end());

  // sn[i] = c[n_index[i]] - sn[i]
  thrust::transform(thrust::make_permutation_iterator(c.begin(), n_index.begin()),
                    thrust::make_permutation_iterator(c.end(), n_index.end()),
                    sn.begin(),
                    sn.begin(),
                    thrust::minus<int>());

  return 0;
}
  

Комментарии:

1. на самом деле я не получаю тех же результатов, что и должен, есть идеи, почему?

2. Если вы отредактируете свой исходный пост, чтобы включить более подробную информацию о коде, который вы пытаетесь перенести, возможно, удастся адаптировать решение. В частности, решение зависит от значений cA , rA , c , и n_index которые неизвестны в вашем сообщении.

3. просто отредактировал его, еще раз спасибо. Если вы попытаетесь раскомментировать // sn[i] = c[n_index[i]] — sn[i] и сохраните его в sn2 для примеров и перекрестной проверки двух массивов, они будут разными.

4. @iassael не могли бы вы, пожалуйста, опубликовать свое решение? 🙂 У меня та же проблема! Заранее благодарю вас

Ответ №2:

Я попробовал первый вариант, но не получил правильных результатов. второй permutation_iterator должен находиться в конце ОБОИХ векторов.

Попробуйте выполнить следующее исправление:

 // sn[i] = c[n_index[i]] - sn[i]
thrust::transform(thrust::make_permutation_iterator(c.begin(), n_index.begin()),
            thrust::make_permutation_iterator(c.end(), n_index.end()),
            sn.begin(),
            sn.begin(),
            thrust::minus<int>());