有没有办法使用推力将数组的所有元素相乘?
Is there a way to multiply all the elements of an array using thrust?
假设我有一个数组,我想将该数组的所有元素相乘并将其存储在一个变量中。我该怎么做?我想将 A 中的所有元素相乘并将结果存储在 S 中。这样做会得到零。
thrust::device_vector<double> A(10);
thrust::sequence(A.begin(), A.end(), 1);
double S = thrust::reduce(thrust::host, A.begin(), A.end(),
0, thrust::multiplies<double>());
这里有两个问题:
thrust::host
执行策略的使用没有任何意义(事实上,如果您使用推力矢量作为输入,则没有任何执行策略有意义)。如果您实际上尝试 运行 这段代码,我会预料到某种段错误或 运行 时间错误。改用基于标签的执行,即只删除第一个参数,thrust 将从类型中推断执行策略。
- 调用您的代码的
thrust::reduce
中的第四个参数是产品的初始值。您将其设置为 0。这意味着通过该代码计算的任何产品都将为零。想必你希望初始值为一。
解决这两个明显的问题让我得到这个:
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
#include <thrust/sequence.h>
#include <iostream>
#include <iomanip>
int main()
{
thrust::device_vector<double> A(10);
thrust::sequence(A.begin(), A.end(), 1.0);
for(auto p = A.begin(); p != A.end(); ++p) {
double v = *p;
std::cout << v << std::endl;
}
double S = thrust::reduce(A.begin(), A.end(), 1.0, thrust::multiplies<double>());
std::cout << "S = " << std::fixed << std::setprecision(1) << S << std::endl;
return 0;
}
编译和运行宁它让我得到这个:
$ nvcc -std=c++11 -o prodprob prodprob.cu
$ ./prodprob
1
2
3
4
5
6
7
8
9
10
S = 3628800.0
正确答案应该是10! = 3628800,所以我判断这是正确的。
假设我有一个数组,我想将该数组的所有元素相乘并将其存储在一个变量中。我该怎么做?我想将 A 中的所有元素相乘并将结果存储在 S 中。这样做会得到零。
thrust::device_vector<double> A(10);
thrust::sequence(A.begin(), A.end(), 1);
double S = thrust::reduce(thrust::host, A.begin(), A.end(),
0, thrust::multiplies<double>());
这里有两个问题:
thrust::host
执行策略的使用没有任何意义(事实上,如果您使用推力矢量作为输入,则没有任何执行策略有意义)。如果您实际上尝试 运行 这段代码,我会预料到某种段错误或 运行 时间错误。改用基于标签的执行,即只删除第一个参数,thrust 将从类型中推断执行策略。- 调用您的代码的
thrust::reduce
中的第四个参数是产品的初始值。您将其设置为 0。这意味着通过该代码计算的任何产品都将为零。想必你希望初始值为一。
解决这两个明显的问题让我得到这个:
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
#include <thrust/sequence.h>
#include <iostream>
#include <iomanip>
int main()
{
thrust::device_vector<double> A(10);
thrust::sequence(A.begin(), A.end(), 1.0);
for(auto p = A.begin(); p != A.end(); ++p) {
double v = *p;
std::cout << v << std::endl;
}
double S = thrust::reduce(A.begin(), A.end(), 1.0, thrust::multiplies<double>());
std::cout << "S = " << std::fixed << std::setprecision(1) << S << std::endl;
return 0;
}
编译和运行宁它让我得到这个:
$ nvcc -std=c++11 -o prodprob prodprob.cu
$ ./prodprob
1
2
3
4
5
6
7
8
9
10
S = 3628800.0
正确答案应该是10! = 3628800,所以我判断这是正确的。