我正在用 CUDA 编写我的第一个程序。它是一个素数生成器。它可以工作,但只比同等的单线程 C++ 代码快 50%。 CPU版本100%使用一个核心。 GPU版本仅使用20%的GPU。 CPU 是 i5 (2310)。 GPU是GF104。
如何提高该算法的性能?
我的完整程序如下。
int* d_C;
using namespace std;
__global__ void primo(int* C, int N, int multi)
{
int i = blockIdx.x*blockDim.x + threadIdx.x;
if (i < N)
{
if(i%2==0||i%3==0||i%5==0||i%7==0)
{
C[i]=0;
}
else
{
C[i]=i+N*multi;
}
}
}
int main()
{
cout<<"Prime numbers \n";
int N=1000;
int h_C[1000];
size_t size=N* sizeof(int);
cudaMalloc((void**)&d_C, size);
int threadsPerBlock = 1024;
int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
vector<int> lista(100000000);
int c_z=0;
for(int i=0;i<100000;i++)
{
primo<<<blocksPerGrid, threadsPerBlock>>>(d_C, N,i);
cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
for(int c=0;c<N;c++)
{
if(h_C[c]!=0)
{
lista[c+N*i-c_z]=h_C[c];
}
else
{
c_z++;
}
}
}
lista.resize(lista.size()-c_z+1);
return(0);
}
我尝试使用二维数组和for
在内核中循环,但无法得到正确的结果。
欢迎来到堆栈溢出。
以下是一些潜在的问题:
为了值得使用 GPU 来查找素数,我认为您需要在 GPU 上实现整个算法,而不仅仅是模数运算。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)