我是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++;
}
但是这段代码填充数组的数据并没有意义。此外,许多值都是零。提前感谢任何帮助,非常感激。