CUDA 错误:'void'之前的预期构造函数、析构函数或类型转换

CUDA error: expected constructor, destructor, or type conversion before 'void'

本文关键字:构造函数 析构函数 类型转换 错误 void CUDA      更新时间:2023-10-16

我是CUDA编程新手。为了练习,我尝试运行一个非常简单的程序,将两个数组中的元素相加,然后将结果存储在一个新数组中。出于组织目的,我试图通过将代码分成多个文件来实现这一点。提前谢谢你!

当我试图编译它时,我一直得到这个错误:"hello.cpp:6:错误:在' void '之前需要构造函数、析构函数或类型转换"

代码如下: hello.cpp

#include <simple.h>
#include <stdlib.h>
#include <stdio.h>
#define N 100
__global__ void add(int *a, int *b, int *c)
{
  int tID = blockIdx.x;
  if (tID < N)
    {
      adding(a, b, c, tID);
    }
}
int main()
{
  int a[N], b[N], c[N];
  int *dev_a, *dev_b, *dev_c;
  cudaMalloc((void **) &dev_a, N*sizeof(int));
  cudaMalloc((void **) &dev_b, N*sizeof(int));
  cudaMalloc((void **) &dev_c, N*sizeof(int));
  // Fill Arrays
  for (int i = 0; i < N; i++)
    {
      a[i] = i,
    b[i] = 1;
    }
  cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice);
  cudaMemcpy(dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice);
  add<<<N,1>>>(dev_a, dev_b, dev_c);
  cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);
  for (int i = 0; i < N; i++)
    {
      printf("%d + %d = %dn", a[i], b[i], c[i]);
    }
  return 0;
}

simple.cpp

#include <simple.h>
__device__ void adding(int *a, int *b, int *c, int tID)
{
       c[tID] = a[tID] + b[tID];  
}

simple.h

#ifndef __simple_h__
#define __simple_h__
 __device__ void adding(int *a, int *b, int *c, int tID);
#endif

Makefile

objects = hello.o simple.o
all: $(objects)
    /usr/local/cuda-7.0/bin/nvcc -arch=sm_20 $(objects) -o app
%.o: %.cpp %.cu
    /usr/local/cuda-7.0/bin/nvcc -x cu -arch=sm_20 -I. -dc $< -o $@
clean:
    rm -f *.o app

当我在我的计算机上运行您的项目时,make在编译*.cpp文件时似乎使用其隐式变量,导致使用g++而不是使用您指定的nvcc

要改变这种行为,必须设置变量CXXCXXFLAGS。以下Makefile为我工作:

objects = hello.o simple.o
CXX = /usr/local/cuda-7.0/bin/nvcc
CXXFLAGS = -x cu -arch=sm_20 -I. -dc
all: $(objects)
    $(CXX) $(objects) -o app
%.o: %.cpp %.cu
    $(CXX) $(CXXFLAGS) $< -o $@

这可能是因为主机端cpp文件中__global__的声明。尝试将所有cuda代码放入.cu文件中。