CUDA素数发生器的低性能

CUDA素数发生器的低性能,cuda,Cuda,我正在用CUDA编写我的第一个程序。它是一个素数生成器。它工作,但是它比等效的单线程C++代码快50%。CPU版本使用一个核心的100%。GPU版本仅使用GPU的20%。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 + thr

我正在用CUDA编写我的第一个程序。它是一个素数生成器。它工作,但是它比等效的单线程C++代码快50%。CPU版本使用一个核心的100%。GPU版本仅使用GPU的20%。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);
}
int*d\C;
使用名称空间std;
__全局无效初始值(int*C,int-N,int-multi)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
if(icout欢迎使用堆栈溢出

以下是一些潜在问题:

  • N=1000太低。由于您有1024个
    线程sperblock
    ,您的内核将只运行一个块,这不足以使用GPU。请尝试N=1000000,这样您的内核启动将有近1000个块

  • 您在GPU上所做的工作非常少(每个测试的数字有4个模数操作)。因此,在CPU上执行这些操作可能比从GPU(通过PCIe总线)复制这些操作更快

为了使使用GPU查找素数变得有价值,我认为您需要在GPU上实现整个算法,而不仅仅是模运算