私は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++;
}
ただし、このコードは、意味のないデータを配列に入力します。さらに、多くの値はゼロです。助けてくれてありがとう、それはありがたいです。