如何在推力变换期间对矢量重新排序?

发布于 2024-12-07 10:23:04 字数 253 浏览 0 评论 0原文

我如何将这个简单的代码转换为推力代码?

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

更多信息: cA 和 rA 是常量整数,因此我们可以认为 'n'= cA-rA sn :浮点数组(n) n_index : int(n) 数组 c : array of float(cA)

我的问题是 n_index[i] 指向 C 数组的元素。 谢谢你!

How could i transform this simple code to thrust code?

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

More Info:
cA and rA are const integers so we can concider as an 'n'= cA-rA
sn : array of float(n)
n_index : array of int(n)
c : array of float(cA)

My problem is with the n_index[i] that points to the element of the C array.
thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

留蓝 2024-12-14 10:23:04

您可以通过使用 permutation_iteratorthrust::transform 与“gather”操作融合来实现此目的:

#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;
}

You can implement this by fusing thrust::transform with a "gather" operation using a 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;
}
我ぃ本無心為│何有愛 2024-12-14 10:23:04

我尝试了第一个,但没有得到正确的结果。第二个 permutation_iterator 需要位于两个向量的末尾。

尝试以下更正:

// sn[i] = c[n_index[i]] - sn[i]
推力::变换(推力::make_permutation_iterator(c.begin(), n_index.begin()),
            推力::make_permutation_iterator(c.end(), n_index.end()),
            sn.begin(),
            sn.begin(),
            推力::减());

I tried the first one and wasn't getting the correct results. the second permutation_iterator needs to be at the end of BOTH vectors.

Try the following correction:

// 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>());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文