无法使用CUDA生成素数

时间:2016-09-21 06:05:00

标签: parallel-processing cuda primes

我只是盯着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。

1 个答案:

答案 0 :(得分:0)

Apt安装nvidia-cuda-toolkit不会安装cuda。

您可以安装cuda表单nvidia's website。 (*使用.deb)