我正在使用一个天真的素数生成函数。这段代码大约需要 5.25 秒来生成 10k 个素数(device_primes[0] 保存已找到的素数,剩余位置为找到的素数)。
_global__ void getPrimes(int *device_primes,int n)
{
int c = 0;
int thread_id = blockIdx.x * blockDim.x + threadIdx.x;
int num = thread_id+2;
if (thread_id == 0) device_primes[0] = 1;
__syncthreads();
while(device_primes[0] < n)
{
for (c = 2; c <= num - 1; c++)
{
if (num % c == 0) //not prime
{
break;
}
}
if (c == num) //prime
{
int pos = atomicAdd(&device_primes[0],1);
device_primes[pos] = num;
}
num += blockDim.x * gridDim.x; // Next number for this thread
}
}
我刚开始优化代码,我做了以下修改,而不是:
for (c = 2; c <= num - 1; c++)
{
if (num % c == 0) //not prime
break;
}
if (c == num) {...}
我现在有了 :
int prime = 1;
...
for (c = 2; c <= num - 1 && prime; c++)
{
if (num % c == 0) prime = 0; // not prime
}
if (prime) {...} // if prime
现在我可以在 0.707 秒内生成 10k。我只是想知道为什么通过这种简单的修改来加快速度,破坏那么糟糕吗?