我无法理解CUDA推力库中的counting_iterator
。它的目的是什么以及如何使用?它是否也可用于其他编程语言,如C ++?
答案 0 :(得分:3)
计数迭代器只是一个迭代器,它从每次迭代器递增时提前的序列返回下一个值。最简单的例子是这样的:
#include <iostream>
#include <thrust/iterator/counting_iterator.h>
int main(void)
{
int n = 10;
thrust::counting_iterator<int>x(1);
for(int i=0; i<n; ++i, ++x) {
std::cout << *x << std::endl;
}
return 0;
}
在编译和运行时执行此操作:
$ /usr/local/cuda/bin/nvcc counting.cc
$ ./a.out
1
2
3
4
5
6
7
8
9
10
即。计数迭代器初始化为值1,每次迭代器递增时,我们得到计数序列中的下一个值,即。 1,2,3,4,5 ....
如果你需要一个序列来填充向量或在变换迭代器或仿函数中操作,那么计数增量就会派上用场。计数迭代器消除了使用您需要的序列显式创建和填充向量的需要。例如(从我对this Stack Overflow question的回答):
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/functional.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/iterator/constant_iterator.h>
#include <cstdio>
int main(void)
{
const int N = 18, M = 3;
thrust::device_vector<int> myvector(N);
thrust::transform( thrust::make_counting_iterator(0),
thrust::make_counting_iterator(N),
thrust::make_constant_iterator(M),
myvector.begin(),
thrust::divides<int>() );
for(int i=0; i<N; i++) {
int val = myvector[i];
printf("%d %d\n", i, val);
}
return 0;
}
产生一个填充序列0,0,0,1,1,2,2,2,3,3,3的设备向量。
答案 1 :(得分:2)
作为另一个例子,这是@talonmies答案的略微修改,您可以通过以下代码模拟Matlab的linspace
命令
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/functional.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/iterator/constant_iterator.h>
#include <cstdio>
void main()
{
const int N = 20;
float a = 3.87f;
float b = 7.11f;
float Dx = (b-a)/(float)(N-1);
thrust::device_vector<float> myvector(N);
thrust::transform(thrust::make_counting_iterator(a/Dx),
thrust::make_counting_iterator((b+1.f)/Dx),
thrust::make_constant_iterator(Dx),
myvector.begin(),
thrust::multiplies<float>());
for(int i=0; i<N; i++) {
float val = myvector[i];
printf("%d %f\n", i, val);
}
getchar();
}
上面的代码将返回
0 3.870000
1 4.040526
2 4.211052
3 4.381579
4 4.552105
5 4.722631
6 4.893158
7 5.063684
8 5.234210
9 5.404737
10 5.575263
11 5.745790
12 5.916316
13 6.086842
14 6.257369
15 6.427895
16 6.598421
17 6.768948
18 6.939474
19 7.110000
显然为linspace(3.87,7.11,20)
。