我正在学习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, ¬_prime, 1, 0, cudaMemcpyHostToDevice);
uint32_t sr = sqrt(n);
unsigned int blocks = sr / 32 + 1;
cuda_prime_kernel<<<blocks, 32>>>(n, sr);
cudaMemcpyFromSymbol(¬_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;
}
答案 0 :(得分:2)
请记住,CUDA必须将必要的变量从CPU复制到GPU(cudaMemcpyToSymbol
),然后从GPU复制回CPU(cudaMemcpyFromSymbol
)。这实际上需要相当多的时间。如果您测试的数字很小,则CPU代码将显着加快,因为它不必担心昂贵的内存传输。如果使用非常大的数字,您将只能看到CUDA代码的显着改进。