我只是盯着cuda,在浏览了矢量和教程here后,我想我会尝试从头开始尝试让我的腿在我的下方。
那就是说我不知道这里的麻烦是一个简单的修复还是一大堆问题。
我的代码的简明英文说明如下:
首先有一个counterClass,它有成员num和count。通过设置count = 0,当count等于num时,当我们迭代整数时,这个计数器类将在除以num时跟踪余数。
我想要并行运行2个函数。第一个被调用的计数将递增所有计数器(并行),第二个将检查是否有任何计数器读取0(并行)如果计数器读取0,则num将n均分,意味着n不是素数。
虽然我希望我的代码只打印素数,会打印所有数字......
以下是代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int num;
int count;
} counterClass;
counterClass new_counterClass(counterClass aCounter, int by, int count){
aCounter.num = by;
aCounter.count = count%by;
return aCounter;
}
__global__ void count(counterClass *Counters){
int idx = threadIdx.x+blockDim.x*blockIdx.x;
Counters[idx].count+=1;
if(Counters[idx].count == Counters[idx].num){
Counters[idx].count = 0;
}
__syncthreads();
}
__global__ void check(counterClass *Counters, bool *result){
int idx = threadIdx.x+blockDim.x*blockIdx.x;
if (Counters[idx].count == 0){
*result = false;
}
__syncthreads();
}
int main(){
int tPrimes = 5; // Total Primes to Find
int nPrimes = 1; // Number of Primes Found
bool *d_result, h_result=true;
counterClass *h_counters =(counterClass *)malloc(tPrimes*sizeof(counterClass));
h_counters[0]=new_counterClass(h_counters[0], 2 , 0);
counterClass *d_counters;
int n = 2;
cudaMalloc((void **)&d_counters, tPrimes*sizeof(counterClass));
cudaMalloc((void **)&d_result, sizeof(bool));
cudaMemcpy(d_counters, h_counters, tPrimes*sizeof(counterClass), cudaMemcpyHostToDevice);
while(nPrimes<tPrimes){
h_result=true;
cudaMemcpy(d_result, &h_result, sizeof(bool), cudaMemcpyHostToDevice);
n+=1;
count<<<1,nPrimes>>>(d_counters);
check<<<1,nPrimes>>>(d_counters,d_result);
cudaMemcpy(&h_result, d_result, sizeof(bool), cudaMemcpyDeviceToHost);
if(h_result){
printf("%d\n", n);
cudaMemcpy(h_counters, d_counters, tPrimes*sizeof(counterClass), cudaMemcpyDeviceToHost);
h_counters[nPrimes]=new_counterClass(h_counters[nPrimes], n , 0);
nPrimes += 1;
cudaMemcpy(d_counters, h_counters, tPrimes*sizeof(counterClass), cudaMemcpyHostToDevice);
}
}
}
有一些类似的问题CUDA - Sieve of Eratosthenes division into parts以及那些寻求改进代码的人提出的问题,CUDA Primes Generation &安培; Low performance in CUDA prime number generator但阅读这些并没有帮助我弄清楚我的代码中出了什么问题!
有关如何在使用CUDA时更有效地进行调试的任何建议都将受到赞赏,如果您能指出我做错了(因为我知道这不是计算机故障),您将拥有我的永远尊重。
修改
显然这个问题只发生在我身上,所以也许这就是我运行代码的方式......
$ nvcc parraPrimes.cu -o primes
$ ./primes
3
4
5
6
另外使用cuda-memCheck作为推荐:
$ cuda-memcheck ./primes
========= CUDA-MEMCHECK
3
4
5
6
========= ERROR SUMMARY: 0 errors
dmesg |grep NVRM
的输出如下::
[ 3.480443] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 304.131 Sun Nov 8 21:43:33 PST 2015
我的系统上没有安装Nvidia-smi。