使用推力(素数)在 GPU 中编译
compiling in GPU using thrust (prime numbers)
我有一个用 C 语言用 thrust 写的代码,但是我没有 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;
}`
谁能帮我编译我的代码并显示结果,如果不能正常工作,然后帮我修复它?
如果您没有 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;
}
我有一个用 C 语言用 thrust 写的代码,但是我没有 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;
}`
谁能帮我编译我的代码并显示结果,如果不能正常工作,然后帮我修复它?
如果您没有 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;
}