STL推力多向量变换?

Posted

技术标签:

【中文标题】STL推力多向量变换?【英文标题】:STL thrust multiple vector transform? 【发布时间】:2011-11-22 17:32:15 【问题描述】:

我想知道是否有更有效的方式来编写 a = a + b + c?

 thrust::transform(b.begin(), b.end(), c.begin(), b.begin(), thrust::plus<int>());
 thrust::transform(a.begin(), a.end(), b.begin(), a.begin(), thrust::plus<int>());

这可行,但有没有一种方法可以只使用一行代码来获得相同的效果? 我查看了示例中的 saxpy 实现,但是它使用了 2 个向量和一个常量值;


这样更有效率吗?

struct arbitrary_functor

    template <typename Tuple>
    __host__ __device__
    void operator()(Tuple t)
    
        // D[i] = A[i] + B[i] + C[i];
        thrust::get<3>(t) = thrust::get<0>(t) + thrust::get<1>(t) + thrust::get<2>(t);
    
;


int main()

     // allocate storage
    thrust::host_vector<int> A;
    thrust::host_vector<int> B;
    thrust::host_vector<int> C;

    // initialize input vectors
    A.push_back(10);
    B.push_back(10);
    C.push_back(10);

    // apply the transformation
    thrust::for_each(thrust::make_zip_iterator(thrust::make_tuple(A.begin(), B.begin(), C.begin(), A.begin())),
                     thrust::make_zip_iterator(thrust::make_tuple(A.end(),   B.end(),   C.end(),   A.end())),
                     arbitrary_functor());

    // print the output
       std::cout << A[0] << std::endl;

    return 0;

【问题讨论】:

这对我来说看起来不错。 【参考方案1】:

a = a + b + c 的算术强度较低(每 4 次内存操作只有两次算术运算),因此计算将受到内存带宽的限制。为了比较您提出的解决方案的效率,我们需要衡量它们的带宽需求。

在第一个解决方案中,对transform 的每次调用都需要对plus 的每次调用进行两次加载和一次存储。因此我们可以将每个transform 调用的成本建模为3N,其中N 是向量abc 的大小。由于transform有两次调用,所以这个方案的代价是6N

我们可以用相同的方式对第二种解决方案的成本进行建模。每次调用arbitrary_functor 需要三个加载和一个存储。所以这个解决方案的成本模型是4N,这意味着for_each 解决方案应该比调用transform 两次更有效。当N 很大时,第二个解决方案应该比第一个解决方案更快地执行6N/4N = 1.5x

当然,您始终可以以类似的方式将zip_iteratortransform 组合起来,以避免两次单独调用transform

【讨论】:

这是一个非常优雅的分析,但我不禁想知道 zip 迭代器有多贵(我经常使用它,但我不知道它的工作原理或性能) .这对这里有影响吗? zip_iterator 确实可以增加内核的占用空间,因为每个压缩迭代器都需要寄存器资源。在此示例中,A 被冗余地包含在 zip 中——一次作为源,一次作为目标。稍微更精简的解决方案可能只在 zip 中发送一次,但考虑到 arbitary_functor 非常简单,它不太可能产生影响。

以上是关于STL推力多向量变换?的主要内容,如果未能解决你的问题,请参考以下文章

使用变换填充向量后,新的 c++11 for 循环不起作用

矩阵与线性变换

Burrows Wheeler 变换 - 变换向量

通过调用变换方法对齐两个持有不同类型的容器

《计算机图形学基础》之变换矩阵

变换矩阵