cuda编程:不要在一个cpp文件中声明__device__和__global__函数


比如一下代码是正常的:


kernel.h

extern __global__ void kernel();

kernel.cu

#include <stdio.h>
#include "kernel.h"
__global__ void kernel()
{
	printf("hello world!");
}

test.cu

#include "kernel.h"
int main(void)
{
	kernel<<<1,1>>>();
	cudaDeviceSynchronize();
return 0;
}


但如果把test.cu的名字改为test.cpp,就出错了。

make all 
Building file: ../src/test2.cpp
Invoking: NVCC Compiler
/usr/local/cuda-5.5/bin/nvcc -G -g -O0 -gencode arch=compute_35,code=sm_35 -odir "src" -M -o "src/test2.d" "../src/test2.cpp"
/usr/local/cuda-5.5/bin/nvcc -G -g -O0 --compile  -x c++ -o  "src/test2.o" "../src/test2.cpp"
In file included from ../src/test2.cpp:3:0:
../src/kernel.h:5:8: 错误: ‘__global__’不是一个类型名
../src/test2.cpp: 在函数‘int main()’中:
../src/test2.cpp:10:2: 错误: ‘kernel’在此作用域中尚未声明
../src/test2.cpp:10:10: 错误: expected primary-expression before ‘<’ token
../src/test2.cpp:10:16: 错误: expected primary-expression before ‘>’ token
../src/test2.cpp:10:18: 错误: expected primary-expression before ‘)’ token
../src/test2.cpp:11:24: 错误: ‘cudaDeviceSynchronize’在此作用域中尚未声明
make: *** [src/test2.o] 错误 1


在这里找到答案

http://stackoverflow.com/questions/16550031/cuda-device-and-global-error-expected-constructor-destructor-or-type

The errors appeared because you included a header file with device code decorators (__device__ and__global__) in a .cpp file. 

The .cpp file by default gets handled directly by the host compiler, which does not know what those decorators mean.


因为cpp默认是用主机编译器即c++的编译器来处理的。

而在test.cpp中包含了kernel.h,kernel.h中声明了__global__函数。






  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CUDA编程是一种利用GPU进行并行计算的编程方法[^1]。在CUDA编程,需要编写host程序和device程序,分别在CPU和GPU上运行,并通过通信进行数据交换。 以下是CUDA编程的一般步骤: 1. 定义host程序:在host程序,可以使用C/C++编写主要的控制逻辑和数据处理代码。host程序负责将数据从主机内存传输到设备内存,并调用device程序进行并行计算。 2. 定义device程序:在device程序,可以使用CUDA C/C++编写并行计算的代码。device程序在GPU上并行执行,可以同时处理多个数据元素。 3. 分配设备内存:在host程序,使用CUDA API函数分配设备内存,以便在GPU上存储数据。 4. 将数据传输到设备:使用CUDA API函数将数据从主机内存复制到设备内存。 5. 启动并行计算:使用CUDA API函数启动并行计算,将设备程序应用于设备上的数据。 6. 将结果传输回主机:使用CUDA API函数将计算结果从设备内存复制到主机内存。 7. 释放设备内存:在host程序,使用CUDA API函数释放设备内存。 以下是一个简单的CUDA编程示例,演示了如何使用CUDA C/C++计算向量的和[^2]: ```cpp #include <stdio.h> __global__ void vectorSum(float *a, float *b, float *c, int size) { int tid = blockIdx.x * blockDim.x + threadIdx.x; if (tid < size) { c[tid] = a[tid] + b[tid]; } } int main() { int size = 1024; float *a, *b, *c; float *d_a, *d_b, *d_c; // 分配主机内存 a = (float*)malloc(size * sizeof(float)); b = (float*)malloc(size * sizeof(float)); c = (float*)malloc(size * sizeof(float)); // 分配设备内存 cudaMalloc(&d_a, size * sizeof(float)); cudaMalloc(&d_b, size * sizeof(float)); cudaMalloc(&d_c, size * sizeof(float)); // 初始化输入数据 for (int i = 0; i < size; i++) { a[i] = i; b[i] = i; } // 将输入数据从主机内存复制到设备内存 cudaMemcpy(d_a, a, size * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(d_b, b, size * sizeof(float), cudaMemcpyHostToDevice); // 启动并行计算 int blockSize = 256; int gridSize = (size + blockSize - 1) / blockSize; vectorSum<<<gridSize, blockSize>>>(d_a, d_b, d_c, size); // 将计算结果从设备内存复制到主机内存 cudaMemcpy(c, d_c, size * sizeof(float), cudaMemcpyDeviceToHost); // 打印结果 for (int i = 0; i < size; i++) { printf("%f ", c[i]); } printf("\n"); // 释放设备内存 cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); // 释放主机内存 free(a); free(b); free(c); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值