如何将内核文件 CUDA 与主 .cpp 文件分开

2023-11-23

当我在同一文件 mainFunc.cu 中使用 kernelAdd() 函数和 main() 函数构建代码时,一切正常。

但是当我将 kernelAdd.cu 文件中的 kernelAdd() 函数与 main.cpp 文件中的主文件分开时,它会出现两个错误:

“错误 C2065:‘添加’:未声明的标识符”

和“错误 C2059:语法错误:'

我在 Visual Studio 2008 和 Cuda v5.0 中构建了它们。

我该如何纠正它的错误?

Thanks!

内核添加文件

__global__ void add(int a, int b, int *c) {
*c = a + b;
}

主函数.cpp

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <conio.h>

int main(void) {

int c;
int *devC;

cudaMalloc((void**) &devC, sizeof(int));
add<<<1,1>>>(2,7,devC);
cudaMemcpy(&c, devC, sizeof(int), cudaMemcpyDeviceToHost);

printf("2+7=%d\n", c);

cudaFree(devC);

getch();
return 0;
}

错误 C2065:“添加”:未声明的标识符

这个错误与CUDA无关。这add函数属于一个编译单元(kernelAdd.cu),而另一个编译单元(mainFunc.cpp)对此一无所知。为了给它这些信息,您必须创建一个额外的头文件kernelAdd.h与函数声明:

__global__ void add(int a, int b, int *c);

并将其包含在mainFunc.cpp:

#include "kernelAdd.h"

Every cu or cpp文件是单独编译的,只知道它在其包含的头文件中看到的函数。

错误 C2059:语法错误:“

现在我在这里猜测(没有VS,甚至没有Windows来检查),但VS似乎根据其扩展名为项目中的每个文件选择编译器。因此mainFunc.cpp使用常见的 C++ 编译器进行编译,但是<<<>>>内核调用的语法不属于标准 C++ — 它来自 CUDA。所有 CUDA 特定语法必须仅在将使用以下命令编译的文件中使用nvcc.

所以解决你的问题的一种方法是重命名mainFunc.cpp to mainFunc.cu。您仍然可以保留您的主文件.cpp,当然,但是你必须将内核调用移动到某个普通的 C++ 函数中cu文件并将其公开在标准 C++ 头文件中,您可以使用该头文件.cpp文件将包括。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将内核文件 CUDA 与主 .cpp 文件分开 的相关文章

  • CUDA线程执行顺序

    我有一个 CUDA 程序的以下代码 include
  • 无法计算表达式 - Visual Studio 调试模式

    当尝试单步执行代码并使用 Visual Studio 中的立即窗口或监视窗口时 我不断收到以下信息 无法评估表达式 我正在使用 Visual Studio 2008 搜索论坛 有很多关于使用重载的 Response Redirect 并将
  • 无法在 CUDA 中执行设备内核

    我正在尝试在全局内核中调用设备内核 我的全局内核是矩阵乘法 我的设备内核正在查找乘积矩阵每列中的最大值和索引 以下是代码 device void MaxFunction float Pd float max int x threadIdx
  • 为什么 Visual Studio 只允许项目中的每个文件有一个链接?

    我希望在一个解决方案的多个不同项目中拥有一个文件 但是 Visual Studio 只允许每个解决方案有一个到该文件的链接 有办法解决这个问题吗 VS 项目中的单个文件有多个软链接会出现什么问题 Update 我已经添加了下面评论中所述的链
  • 如何在 VC++ 中使用 _W64 和 __w64?

    有这样的事情 w64 http msdn microsoft com en us library s04b5w00 VS 71 aspx在 Visual C 9 中 我在尝试将本机 C DLL 移植到 64 位时遇到了它 特别是在crtde
  • 显示删除了多少行

    我使用C 程序 我的数据库是SQL Server 2008 当用户从数据库中删除一些行时 我想在 Windows 应用程序中向他 她显示删除了多少行 我想知道如何将 SQL 消息发送到 C 并向用户显示 例如 当我从表中删除 4 行时 SQ
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • 无法访问 VBA 中的 COM 公开方法

    我正在尝试在 VBA 中访问 COM 公开的方法 Problem 我看到所有默认方法 例如GetHashCode GetType and ToString 在 VBA 中但是not那些是 COM 接口的一部分并且专门编写为 COM 可见的
  • 有什么方法可以延迟 Visual Studio 中智能感知的淡入时间吗?

    我刚刚切换到 VS2008 智能感知比 2005 年更加 有用 我发现它真的打破了我的注意力 每次我到达标记或关键词或其他任何内容的末尾时 它都会弹出 我必须按 ESC 或忽略它 这是really恼人的 我无法找到延迟其激活的设置 我确实想
  • 为什么在 Windows 上安装预编译版本的 LAPACK 时出现错误?

    我正在尝试使用犰狳矩阵库进行矩阵计算 它需要 BLAS 和 LAPACK Armadillo 文档建议从以下位置获取预编译版本http www stanford edu vkl code libs html http www stanfor
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • vs2008中的线程窗口在哪里

    我试图在 VS 2008 中找到描述的线程窗口here http www wintellect com cs blogs jrobbins archive 2007 08 01 neat new multithreaded debuggin
  • #define, #ifdef #undef #endif

    我有以下代码 define PROC ADD void main void while 1 ifdef PROC ADD Do this code here then undefined it to run the code in the
  • 从 VS.NET 2008 转换到 2010 时 Windows 服务安装项目出现问题

    我正在尝试将解决方案从 VS NET 2008 转换为 2010 该解决方案包括一个 Windows 服务项目和一个安装 Windows 服务的安装项目 我在编译安装项目时遇到问题 我已经尝试按照教程从头开始几次here http msdn
  • Visual Studio 项目有简单的自动备份系统吗?

    我正在使用 Visual Studio 2008 Express 我希望 Visual Studio 或者可能是外接程序 将我的整个项目保存到某种自动增量存档或任何可以帮助我从灾难中恢复的文件中 我对 SVN 或复杂的版本控制系统没有太多需
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 证书问题 - Windows 7 升级后导入密钥“对象已存在”时出错

    我有大约 60 个 pfx 文件 用于项目的所有主要程序集 它们是独特的文件 但我对所有文件使用相同的密码 从 Windows Vista 升级到 Windows 7 后 当我在 Visual Studio 2008 中单击 生成 时 会出
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do

随机推荐