从这里开始.
假设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)
Run Code Online (Sandbox Code Playgroud)dev_Kx - dev_X.
我想使用整个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
?
许多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)
这会将整个内容复制X
到dev_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
将:
dev_Kx
dev_X
(必须至少包含 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)
归档时间: |
|
查看次数: |
694 次 |
最近记录: |