编译为CUDA内核调用提供了“表达式必须具有整数或无作用域的枚举类型”

时间:2019-10-22 12:47:00

标签: c++ cuda

我以第一个示例进入CUDA领域:计算Pi。 不幸的是出了点问题,我不明白为什么。

我从CPU的工作代码开始,然后进行了一些更改(添加了__global__,将new更改为cudaMallocManaged,并在内核调用处添加了尖括号)试图在GPU上运行相同的代码。 我的目的是在GPU上运行单个实例,我知道实际代码并未并行化。

代码如下:

#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <chrono>

#define NLIM 100000000

__global__
void compute_r(int *mem, double *rand_real, double *rand_imag ) {

    for (int i=0; i<int(NLIM); i++) {

        if ((sqrt(rand_real[i]*rand_real[i] + rand_imag[i]*rand_imag[i])) <= 1.0f) {
            mem[i] = 1;
        }
        else
            mem[i] = 0;
    }
}

int main(int argc, const char * argv[]) {

    std::cout << "Refine Pi using " << NLIM << " iterations" << std::endl;

    double pi;
    int inner=0;
    int *gpu_inner;
    double *rand_imag; double *rand_real;
    cudaMallocManaged(&gpu_inner,sizeof(int)*int(NLIM));
    cudaMallocManaged(&rand_real,sizeof(double)*int(NLIM));
    cudaMallocManaged(&rand_imag,sizeof(double)*int(NLIM));

    for (int i=0; i<int(NLIM); i++) {
        rand_real[i] = double(rand()) / double(RAND_MAX);
        rand_imag[i] = double(rand()) / double(RAND_MAX);
    }

   compute_r<<1, 1>> (gpu_inner,rand_real,rand_imag);

    cudaDeviceSynchronize();

    for (int i=0; i<int(NLIM); i++) {
        inner += gpu_inner[i];
    }

    pi= 4.0f* (inner/double(NLIM));
    std::cout << "Pi is " << pi << std::endl;

    return 0;
}


我已经使用nvcc -std=c++11 main.cu在具有GPU支持的Amazon EC2集群上简单地编译了代码。

1 个答案:

答案 0 :(得分:1)

您的cuda电话需要看起来像compute_r<<<1, 1>>> (gpu_inner, rand_real, rand_imag);。仅使用两个'<'或'>'字符,编译器会指出您正在尝试进行移位操作并抱怨。