나는 cuda를 처음 사용하고 있으며 Eratosthenes의 체를 수행하는 데 사용하려고합니다. 코드는 1000000 이하의 소수 (primes)에서 작동합니다. 그 위에는 알 수없는 커널 실행 오류가 발생합니다. 이제는 너무 많은 블록이있는 표를 시작하려고하기 때문에 이것이라고 생각합니다. 그러나 블록을 1000으로 설정하면 모든 소수를 얻지 못합니다. kernal에서 색인 생성에 문제가있을 수 있지만 확실하지 않을 수 있습니다.Eratosthenes의 Cuda Sieve가 1000000보다 큰 경우
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
__global__ static void Sieve(long * sieve, long sieve_size)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx > 1) {
for (int i = idx+idx; i < sieve_size; i += idx) {
sieve[i] = 1;
}
}
}
int main()
{
long *device_sieve;
long *host_sieve = new long[4000000];
ofstream data("data.csv", ofstream::out);
double sieve_size = 4000000/sizeof(long);
cudaSetDevice(0);
cudaDeviceSynchronize();
cudaThreadSynchronize();
cudaMalloc((void**)&device_sieve, sizeof(long) * sieve_size);
cudaError_t error1 = cudaGetLastError();
cout << "1" << cudaGetErrorString(error1) << endl;
int block = sqrt(sieve_size);
Sieve << <1, block >> >(device_sieve, sieve_size);
cudaThreadSynchronize();
cudaMemcpy(host_sieve, device_sieve, sizeof(long) * sieve_size, cudaMemcpyDeviceToHost);
cudaError_t error = cudaGetLastError();
cout << "2" << cudaGetErrorString(error) << endl;
cudaFree(device_sieve);
for (int i = 2; i < sieve_size; ++i)
if (host_sieve[i] == 0)
data << i << endl;
getchar();
cout << "DONE" << endl;
return 0;
}