使用推力(素数)在GPU中编译

时间:2018-06-04 22:33:10

标签: c++ thrust

我有一个用C语言编写的代码,但由于我没有GPU,我无法编译它。我的代码应该计算前1000个素数。而已。但问题是

1 - 我无法编译它,因为我没有GPU。

2 - 由于我无法编译它,我不知道它是否真的计算了素数。

这是我的代码:

`struct prime{
_host_ _device_
    void operator()(long& x){
    bool result = true;
    long stop = ceil(sqrt((float)x));
    if(x%2!=0){
        for(int i = 3;i<stop;i+=2){
            if(x%i==0){
                result = false;
                break;
            };
        }
    }else{
        result = false;
    }
    if(!result)
        x = -1;
 }
};
void doTest(long gen){
  using namespace thrust;
  device_vector<long> tNum(gen);
  thrust::sequence(tNum.begin(),tNum.end());
}
int main(){
   doTest(1000);
   return 0;
}`

有人可以帮我编译代码并显示结果,如果工作不正常,请帮我修复一下吗?

1 个答案:

答案 0 :(得分:2)

如果您没有GPU,请使用thrust::host_vector代替thrust::device_vector

我已经清理了你的代码,它在CPU上运行如下:

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sequence.h>

#include <iostream>


int main()
{
    thrust::host_vector<long> tNum(1000);
    thrust::sequence(std::begin(tNum), std::end(tNum));
    thrust::transform(std::cbegin(tNum), std::cend(tNum), std::begin(tNum), [](long x)
    {
        bool result = true;
        long stop = (long)std::ceil(std::sqrt((float)x));
        if (x % 2 != 0) {
            for (long i = 3; i < stop; i += 2) {
                if (x % i == 0) {
                    result = false;
                    break;
                };
            }
        } else {
            result = false;
        }
        if (!result) x = -1;
        return x;
    });
    for (const auto& element : tNum) if (element>0) std::cout << element << ", ";
    std::cout << std::endl;

    std::cin.ignore();
    return 0;
}