【问题标题】:Low performance in CUDA prime number generatorCUDA 素数生成器的性能低下
【发布时间】:2012-09-10 23:19:28
【问题描述】:

我正在用 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 循环,但无法获得正确的结果。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    欢迎来到 Stack Overflow。

    以下是一些潜在问题:

    • N = 1000 太低。由于您有 1024 个threadsPerBlock,因此您的内核将只运行一个块,这不足以利用 GPU。试试 N = 1000000,这样你的内核启动就接近 1000 个块。

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2016-06-29
      • 2012-03-04
      • 1970-01-01
      • 2013-03-27
      • 2011-09-11
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多