我是 CUDA 的新手。我正在尝试并行化以下代码。现在它位于内核上,但根本不使用线程,因此速度很慢。我试图使用这个答案,但到目前为止无济于事。
内核应该生成前 n 个素数,将它们放入 device_primes 数组,稍后从主机访问该数组。代码是正确的,并且在串行版本中工作正常,但我需要加快速度,也许使用共享内存。
//CUDA kernel code
__global__ void generatePrimes(int* device_primes, int n)
{
//int i = blockIdx.x * blockDim.x + threadIdx.x;
//int j = blockIdx.y * blockDim.y + threadIdx.y;
int counter = 0;
int c = 0;
for (int num = 2; counter < n; num++)
{
for (c = 2; c <= num - 1; c++)
{
if (num % c == 0) //not prime
{
break;
}
}
if (c == num) //prime
{
device_primes[counter] = num;
counter++;
}
}
}
我当前的、初步的、绝对错误的并行化尝试如下所示:
//CUDA kernel code
__global__ void generatePrimes(int* device_primes, int n)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
int num = i + 2;
int c = j + 2;
int counter = 0;
if ((counter >= n) || (c > num - 1))
{
return;
}
if (num % c == 0) //not prime
{
}
if (c == num) //prime
{
device_primes[counter] = num;
counter++;
}
num++;
c++;
}
但是这段代码用没有意义的数据填充了数组。此外,许多值为零。提前感谢您的帮助,不胜感激。