Cuda 减法的正确要求

Cuda 减法的正确要求,cuda,thrust,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 ( ThreadsP

下面是

假设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() );
我想使用整个dev_Kx向量,因为它是从.begin到.end和整个dev_X向量

上面的代码使用dev_X.begin

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

此外,例如:

thrust::copy(
    X.begin(),    // begin input iterator
    X.end(),      // end input iterator
    dev_X.begin() // begin output iterator
);
如果我想用

thrust::transform( dev_Kx, dev_Kx + i , dev_X.begin() ,distX.begin() , thrust::minus<int>() ); 
然后dev_Kx从0到i,dev_X开始?它将使用相同的长度?0到i?或者它将使用dev_X的长度?

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

例如:

thrust::copy(
    X.begin(),    // begin input iterator
    X.end(),      // end input iterator
    dev_X.begin() // begin output iterator
);
这会将X的全部内容复制到dev_X中。为什么不需要dev_X.end?因为“推力”要求程序员注意适当调整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>()
);
请注意,如何只需要一个末端迭代器

在一个不相关的注释中,以下内容:

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

可以用更惯用、更少出错的C++改写:

std::vector<int> X(ThreadsPerBlockX * BlocksPerGridX);
std::iota(X.begin(), X.end(), 0);
许多推力和标准库函数将范围作为第一个参数,然后假设所有其他迭代器都由相同大小的容器支持。范围是一对迭代器,指示序列的开始和结束

例如:

thrust::copy(
    X.begin(),    // begin input iterator
    X.end(),      // end input iterator
    dev_X.begin() // begin output iterator
);
这会将X的全部内容复制到dev_X中。为什么不需要dev_X.end?因为“推力”要求程序员注意适当调整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>()
);
请注意,如何只需要一个末端迭代器

在一个不相关的注释中,以下内容:

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

可以用更惯用、更少出错的C++改写:

std::vector<int> X(ThreadsPerBlockX * BlocksPerGridX);
std::iota(X.begin(), X.end(), 0);

@朴英培:所以,如果我想使用推力::transform dev_Kx,dev_Kx+I,dev_X.begin,distX.begin,推力::减号。dev_Kx将从0变为i,dev_X是否开始?它的长度相同吗?0到i?或者它将使用dev_X的长度?@Park Young Bae:你说的“第一个完整范围”是什么意思?无论如何,据我所知,dev_Kx将从0变为I,dev_X将从0变为ThreadsPerBlockX*BlocksPerGridX,对吗?请回答,谢谢@朴英培:所以,如果我想使用推力::transform dev_Kx,dev_Kx+I,dev_X.begin,distX.begin,推力::减号。dev_Kx将从0变为i,dev_X是否开始?它的长度相同吗?0到i?或者它将使用dev_X的长度?@Park Young Bae:你说的“第一个完整范围”是什么意思?无论如何,据我所知,dev_Kx将从0变为I,dev_X将从0变为ThreadsPerBlockX*BlocksPerGridX,对吗?请回答,谢谢!:好的,我明白了。有没有办法使用dev_Kx的10个元素以及dev_X中的更多元素?例如,我想做:dev_Kx[0]-dev_X[0]、dev_Kx[0]-dev_X[1]、dev_Kx[0]-dev_X[2]……所以,使用dev_Kx中的10个元素,以及dev_X中的100个元素,这与转换一样是不可行的。您必须实现自己的迭代器,将10个元素调整为100个元素。或者实现您自己的转换算法。好的,我明白了。有没有办法使用dev_Kx的10个元素以及dev_X中的更多元素?例如,我想做:dev_Kx[0]-dev_X[0]、dev_Kx[0]-dev_X[1]、dev_Kx[0]-dev_X[2]…所以,使用dev_Kx中的10个元素,例如dev_x中的100个元素,这与转换不一样。您必须实现自己的迭代器,将10个元素调整为100个元素。或者实现您自己的转换算法。