我以第一个示例进入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集群上简单地编译了代码。
答案 0 :(得分:1)
您的cuda电话需要看起来像compute_r<<<1, 1>>> (gpu_inner, rand_real, rand_imag);
。仅使用两个'<'或'>'字符,编译器会指出您正在尝试进行移位操作并抱怨。