CUDA Primes Generation

当数据大小增加超过260k时,我的CUDA程序停止工作(它什么都不打印)。

有人能告诉我为什么会这样吗? 这是我的第一个CUDA计划。 如果我想要更大的素数,如何在CUDA上使用大于long long int的数据类型?

显卡是GT425M。

#include #include #include #define SIZE 250000 #define BLOCK_NUM 96 #define THREAD_NUM 1024 int data[SIZE]; __global__ static void sieve(int *num,clock_t* time){ const int tid = threadIdx.x; const int bid = blockIdx.x; int tmp=bid*THREAD_NUM+tid; if(tid==0) time[bid] = clock(); while(tmp<SIZE){ int i=1; while(((2*tmp+3)*i+tmp+1)<SIZE){ num[(2*tmp+3)*i+tmp+1] = 0; i++; } tmp+=BLOCK_NUM*THREAD_NUM; } if(tid==0) time[bid+BLOCK_NUM] = clock(); } void GenerateNumbers(int *number,int size){ for(int i=0;i<size;i++) number[i] = 2*i+1; number[0] = 2; } int main(){ GenerateNumbers(data,SIZE); int *gpudata; clock_t* time; int cpudata[SIZE]; cudaMalloc((void**)&gpudata,sizeof(int)*SIZE); cudaMalloc((void**)&time,sizeof(clock_t)*BLOCK_NUM*2); cudaMemcpy(gpudata,data,sizeof(int)*SIZE,cudaMemcpyHostToDevice); sieve<<>>(gpudata,time); clock_t time_used[BLOCK_NUM * 2]; cudaMemcpy(&cpudata,gpudata,sizeof(int)*SIZE,cudaMemcpyDeviceToHost); cudaMemcpy(&time_used,time,sizeof(clock_t)*BLOCK_NUM*2,cudaMemcpyDeviceToHost); cudaFree(gpudata); for(int i=0;i<SIZE;i++) if(cpudata[i]!=0) printf("%d\t",cpudata[i]); clock_t min_start,max_end; min_start = time_used[0]; max_end = time_used[BLOCK_NUM]; for(int i=1;itime_used[i]) min_start=time_used[i]; if(max_end<time_used[i+BLOCK_NUM]) max_end=time_used[i+BLOCK_NUM]; } printf("\nTime Cost: %d\n",max_end-min_start); } 

(unsigned)long long int提供64位。 没有内置的非向量整数类型,它比64位宽。 但是,您可以轻松构建自己的128位整数类型。 例如:

 typedef struct { unsigned long long int lo; unsigned long long int hi; } my_uint128; my_uint128 add_uint128 (my_uint128 a, my_uint128 b) { my_uint128 res; res.lo = a.lo + b.lo; res.hi = a.hi + b.hi + (res.lo < a.lo); return res; } 

如果需要更高性能的解决方案,可以考虑将128位整数映射到uint4并使用内联PTX来更有效地处理四个32位块之间的进位。 资源