编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"



我正在通过第一个例子进入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;
}

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

您的 cuda 调用需要看起来像compute_r<<<1, 1>>> (gpu_inner, rand_real, rand_imag);.只有两个"<"或">"字符,编译器会发现您正在尝试执行位移操作并抱怨。

相关内容

最新更新