适当的推力要求减法

Geo*_*rge 1 cuda thrust

这里开始.

假设dev_X是一个向量.

int * X = (int*) malloc( ThreadsPerBlockX * BlocksPerGridX * sizeof(*X) );


for ( int i = 0; i < ThreadsPerBlockX * BlocksPerGridX; i++ )
    X[ i ] = i;

// create device vectors
thrust::device_vector<int> dev_X ( ThreadsPerBlockX * BlocksPerGridX );

//copy to device
thrust::copy( X , X + theThreadsPerBlockX * theBlocksPerGridX , dev_X.begin() );
Run Code Online (Sandbox Code Playgroud)

以下是减法:

   thrust::transform( dev_Kx.begin(), dev_Kx.end(), dev_X.begin() , distX.begin() , thrust::minus<float>() );
Run Code Online (Sandbox Code Playgroud)
dev_Kx - dev_X.
Run Code Online (Sandbox Code Playgroud)

我想使用整个dev_Kx向量(因为它使用的是因为它从.begin到.end())和整个dev_X向量.

上面的代码使用 dev_X.begin().

这意味着它会使用整个dev_X向量吗?从头开始?或者我必须使用另一个额外的参数来指向dev_X.end()?(因为在上面的函数调用中我不能只使用这个额外的参数)

另外,例如:

如果我想用

thrust::transform( dev_Kx, dev_Kx + i , dev_X.begin() ,distX.begin() , thrust::minus<int>() ); 
Run Code Online (Sandbox Code Playgroud)

然后dev_Kx会从0到i和dev_X.begin()?它会使用相同的长度?(0到i?)或者它会使用的长度dev_X

use*_*016 7

许多thrust(和标准库)函数将范围作为第一个参数,然后假设所有其他迭代器都由相同大小的容器支持.范围是一对指示序列开始结束的迭代器.

例如:

thrust::copy(
    X.begin(),    // begin input iterator
    X.end(),      // end input iterator
    dev_X.begin() // begin output iterator
);
Run Code Online (Sandbox Code Playgroud)

这会将整个内容复制Xdev_X.为什么dev_X.end()不需要?因为thrust要求程序员正确地调整大小dev_X,以便能够包含至少与输入范围中一样多的元素.如果您不满足该保证,则行为未定义.

当你这样做:

thrust::transform(
    dev_Kx.begin(), // begin input (1) iterator
    dev_Kx.end(),   // end input (1) iterator
    dev_X.begin(),  // begin input (2) iterator
    distX.begin(),  // output iterator
    thrust::minus<float>()
);
Run Code Online (Sandbox Code Playgroud)

什么thrust看到的是从输入范围dev_Kx.begin()dev_Kx.end().它的大小明确dev_Kx.end() - dev_Kx.begin().为什么dev_X.end()distX.end()没有必要?因为它们也具有隐含的大小dev_Kx.end() - dev_Kx.begin().例如,如果有10个元素dev_Kx,那么transform将:

  • 使用10个元素 dev_Kx
  • 使用10个元素dev_X(必须至少包含 10个元素)
  • 执行减法并存储10个结果distX,该结果必须能够容纳至少 10个元素.

也许看一下实施就可以解决任何疑问.这是一些伪代码:

void transform(InputIterator input1_begin, InputIterator input1_end,
               InputIterator input2_begin, OutputIterator output,
               BinaryFunction op) {
    while (input1_begin != input1_end) {
        *output++ = op(*input1_begin++, *input2_begin++);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意如何只需要一个结束迭代器.


在一个不相关的说明中,以下内容:

int * X = (int*) malloc( ThreadsPerBlockX * BlocksPerGridX * sizeof(*X) );
for ( int i = 0; i < ThreadsPerBlockX * BlocksPerGridX; i++ )
    X[ i ] = i;
Run Code Online (Sandbox Code Playgroud)

可以用更惯用,更不易出错的C++重写:

std::vector<int> X(ThreadsPerBlockX * BlocksPerGridX);
std::iota(X.begin(), X.end(), 0);
Run Code Online (Sandbox Code Playgroud)