我怎样才能加快这个cuda计划的速度?

时间:2015-08-06 01:49:09

标签: c++ cuda

我正在学习CUDA。我写了这个程序来测试一个数字是否为素数。它比cpu实现慢很多倍。我做了什么明显的错误,如果是这样,我怎么能加快它(我也知道我不需要检查evens我还没有编码优化。)我也尝试了视觉分析器。看起来它大部分时间都花在memcpyToSymbol上。

#include <cuda.h>
#include <iostream>
#include <cmath>
#include <cstdint>
#include <stdio.h>
#include <ctime>

__device__ bool _not_prime_flag;
__global__ void cuda_prime_kernel(uint32_t n, uint32_t sr)
{
    uint32_t d = blockIdx.x * blockDim.x + threadIdx.x;
    if(d > 2 && d <= sr && n % d == 0)
        _not_prime_flag = true;
}
bool cuda_prime(uint32_t n)
{
    if(n == 2)
        return true;
    if(n % 2 == 0)
        return false;

    bool not_prime = false;
    cudaMemcpyToSymbol(_not_prime_flag, &not_prime, 1, 0, cudaMemcpyHostToDevice);
    uint32_t sr = sqrt(n);

    unsigned int blocks = sr / 32 + 1;
    cuda_prime_kernel<<<blocks, 32>>>(n, sr);
    cudaMemcpyFromSymbol(&not_prime, _not_prime_flag, 1, 0, cudaMemcpyDeviceToHost);
    return !not_prime;
}

bool cpu_prime(uint32_t n)
{
    if(n == 2)
        return true;
    if(n % 2 == 0)
        return false;
    std::cout << "Here" << std::endl;
    uint32_t sr = sqrt(n);

    for(uint32_t i = 3; i <= sr; i += 2)
        if(n % i == 0)
            return false;
    return true;
}

int main()
{
    std::cout << cuda_prime(1000001) << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:2)

请记住,CUDA必须将必要的变量从CPU复制到GPU(cudaMemcpyToSymbol),然后从GPU复制回CPU(cudaMemcpyFromSymbol)。这实际上需要相当多的时间。如果您测试的数字很小,则CPU代码将显着加快,因为它不必担心昂贵的内存传输。如果使用非常大的数字,您将只能看到CUDA代码的显着改进。