使用 C++11 的 CUDA 6.0 的 CMake 脚本

2023-12-15

我正在为我的 CUDA 6.0 + Boost 1.55.0 + OpenCV 2.4.9 项目开发 64 位 Mac OSX 10.9,使用 makefile 进行编译,但由于我最终将在 64 位 Windows 8.1 上测试它,我想我'熟悉 CMake。由于我使用的是 C++11,因此我使用 clang++(版本 5.1 (clang-503.0.40),g++ 现在在 mavericks 中链接到)为 C++ 代码生成对象文件,并使用 nvcc 分别生成 CUDA 代码,然后链接对象我的 makefile 中的最终可执行文件放在一起。

我不知道如何在 CMake 中做到这一点。我尝试将 CUDA 代码编译为静态库(使用 CMake 内置函数和 FindCUDA.cmake 实用程序),然后链接它,但这不起作用。我无法在网上找到考虑 C++11 的解决方案。

这是到目前为止我的 CMake 脚本:

cmake_minimum_required(VERSION 2.8)

project(pupil_tracker)

include_directories(include)
include_directories(include/cuda)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_20, code=sm_20)
#set(CUDA_HOST_COMPILER clang++) # Fails with 'invalid argument '-std=c++11' not allowed with 'C/ObjC''

find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIR})

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}) # So CMake finds FindOpenCV.cmake
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

CUDA_ADD_LIBRARY(cuda_obj STATIC src/cuda/Tools.cu) # Doesn't seem to work

add_executable(main src/main.cpp src/CenteredHaarFeature.cpp src/PupilTracker.cpp src/Tools.cpp)

target_link_libraries(main ${Boost_LIBRARIES})
target_link_libraries(main ${CUDA_LIBRARIES})
target_link_libraries(main ${OpenCV_LIBS})
target_link_libraries(main ${cuda_obj})

install(TARGETS main DESTINATION ../bin)

如果全部失败,我将不得不尝试在我的 Windows 计算机上设置一个 MSVC 项目来执行相同的操作。


The CMAKE_CXX_FLAGS可能会干扰 NVCC 编译,因此您必须小心放置它们的位置。

我仅使用 CUDA 库通过一个非常简单的示例重新创建了您的设置。重新排列和编辑一些 CMake 命令后,我能够编译并运行该程序。

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project(pupil_tracker)

include_directories(include)
include_directories(include/cuda)

# removed a space and added C++11 functionality (note the double '--' for NVCC)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_20,code=sm_20;--std=c++11)
set(CUDA_HOST_COMPILER clang++) # shouldn't fail anymore

# didn't test with Boost
# find_package(Boost COMPONENTS system filesystem REQUIRED)
# include_directories(${Boost_INCLUDE_DIR})

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS})

# didn't test with OpenCV
# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}) # So CMake finds FindOpenCV.cmake
# find_package(OpenCV REQUIRED)
# include_directories(${OpenCV_INCLUDE_DIRS})

CUDA_ADD_LIBRARY(cuda_obj STATIC src/cuda/Tools.cu) # works for me now

# moved the CXX flags to after the cuda_add_library call
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
add_executable(main src/main.cpp src/Tools.cpp) # only used one c++ class for this test

# target_link_libraries(main ${Boost_LIBRARIES})
target_link_libraries(main ${CUDA_LIBRARIES})
# target_link_libraries(main ${OpenCV_LIBS})
target_link_libraries(main cuda_obj) # changed ${cuda_obj} to cuda_obj

install(TARGETS main DESTINATION ../bin)

项目目录设置可以从 CMake 文件中推断出来,但为了澄清起见,它看起来像:

项目目录:

  • CMakeLists.txt
  • include
    • 工具.hpp
    • cuda
      • 工具.cuh
  • src
    • main.cpp
    • 工具.cpp
    • cuda
      • Tools.cu

工具.cuh:

#ifndef TOOLS_CUH
#define TOOLS_CUH

extern "C"
{
    void do_cuda_stuff();
}

#endif

工具.cu:

#include <cuda_runtime.h>
#include <stdio.h>

extern "C"
{
    __global__
    void do_cuda_stuff_kernel()
    {
        int idx = blockIdx.x * blockDim.x + threadIdx.x;
        printf("Hello from thread %d!\n", idx);
    }

    void do_cuda_stuff()
    {
        // 2 blocks, 3 threads each
        do_cuda_stuff_kernel<<<2, 3>>>();
        cudaDeviceSynchronize(); // to print results
    }
}

工具.hpp:

#ifndef TOOLS_HPP
#define TOOLS_HPP

class Tools
{
public:
    int execute();
};

#endif

工具.cpp:

#include "Tools.hpp"
#include "Tools.cuh"

int Tools::execute()
{
    do_cuda_stuff();
    return 0;
}

主要.cpp:

#include "Tools.hpp"

int main(void)
{
    Tools tools;
    return tools.execute();
}

Output:

Hello from thread 3!
Hello from thread 4!
Hello from thread 5!
Hello from thread 0!
Hello from thread 1!
Hello from thread 2!

我目前正在使用 CUDA 7.5 和 OSX 10.10,但我认为最大的问题是CMAKE_CXX_FLAGS多变的。希望这可以帮助!干杯!

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

使用 C++11 的 CUDA 6.0 的 CMake 脚本 的相关文章

随机推荐

  • 列出 DataGrid 中的目录文件

    我搜索了很多主题 但找不到有关使用 WPF 的答案DataGrid列出目录中的文件名内容 我能够输出内容ListBox但不知道如何将项目添加到Column in DataGrid 这适用于ListBox string path C obje
  • ASP MVC3 数据库优先

    我使用ASP MVC3应用程序的实体框架 起初我使用代码优先的方法 我创建了类并使用属性来验证数据字段 public class Person public int ID get set Required ErrorMessage Name
  • 以二进制方式将utf16写入文件

    我正在尝试以二进制模式使用 ofstream 将 wstring 写入文件 但我认为我做错了 这是我尝试过的 ofstream outFile test txt std ios out std ios binary wstring hell
  • 如何在vb代码内的DataTable上的linq中正确执行“group by”?

    为什么以下 group by 子句不起作用 最初的问题是如何在 LINQ 内的 vb 代码 dot net v4 0 中使用 DataTable 和组上的总和执行组 这是示例 但它没有产生所需的输出 它返回 2 行而不是 1 行 Dim t
  • 如何更新 Python 包?

    我正在运行 Ubuntu 9 10 并安装了一个名为 M2Crypto 的软件包 版本为 0 19 1 我需要下载 构建并安装最新版本的 M2Crypto 软件包 0 20 2 0 19 1 软件包在多个位置都有文件 包括 usr shar
  • java中有没有命令可以让程序回到循环的开头

    我正在尝试用java制作一款打字冒险类游戏 但是我需要一个至少类似于标题中的命令 这是代码 import java util Scanner public class MyFirstGameInJava public static void
  • 为什么我会收到此 Oracle 连接错误? ORA-12519,TNS:未找到适当的服务处理程序

    我正在使用 GlassFish Hibernate Spring 用于事务管理 和 Oracle 11g 构建一个 JSF2 应用程序 应用程序运行一段时间后 应用程序无法查询数据库 并且我在 GlassFish 日志中收到以下错误 原因
  • 嵌入 YouTube 视频 - 拒绝在框架中显示,因为它将“X-Frame-Options”设置为“SAMEORIGIN”[重复]

    这个问题在这里已经有答案了 我正在尝试向我的 Django 页面提供从其他地方获得的一些资源 在 feed 中 我有 YouTube 视频 其 URL 如下 https www youtube com watch v A6XUVjK9W4o
  • graph.facebook.com - 传输安全块

    错误 传输安全已阻止明文 HTTP http 资源加载 因为它不安全 可以通过应用程序的 Info plist 文件配置临时例外 当尝试访问 graph facebook com 等时 我已经把 NS允许任意负载在 plist 上 但它不断
  • 添加约束以防止 SQL 更新触发器中出现重复

    我们有一个用户表 每个用户都有一个唯一的电子邮件和用户名 我们尝试在代码中执行此操作 但我们希望确保用户永远不会使用相同的电子邮件用户名插入 或更新 到数据库中 我添加了一个BEFORE INSERT防止插入重复用户的触发器 CREATE
  • 使用英特尔编译器构建 Boost 库

    除了 Visual Studio 2012 之外 我还在 32 位 Windows 7 计算机上安装了 Intel Parallel Studio XE 2013 我尝试按照 Intel 编译器中的说明构建 Boost 1 53link 我
  • 在oracle中只检索表的第二行?

    谁能帮忙 如何从oracle表中准确检索第二行 由于表中的行本质上是无序的 因此 第一个 和 第二个 的概念要求您指定某种强制顺序的方法 即 ORDER BY 子句 最简单的方法是使用解析函数 SELECT FROM SELECT a ro
  • 如何在 SQL Server 中传递两个 sql 表作为 r 代码的输入参数

    我正在 SQL Server 中运行 r 代码 我在 SQL Server 数据库中有两个表 我想将它们作为输入数据集传递到 R 代码中 我可以用 input data 1传递输入数据集之一 我怎样才能通过另一张桌子 我读自一个 MSDN
  • 减少多个 box-shadow 参数的 mixin 问题

    我正在一个项目中工作 我必须减少使用 就我个人而言 我总是使用手写笔 但我不能使用这个项目 所以我有下一个问题 我怎样才能用更少的手写笔做到这一点 问题在于参数的数量 在手写笔中 box shadow webkit box shadow a
  • C++ 中新内存的范围

    当我尝试执行以下操作时 出现错误 提示我正在尝试读取或写入受保护的内存 void func1 int ptr int ptr b new int 5 ptr ptr b void main int ptr a func1 ptr a del
  • NoClassDefFoundError Android 与 ActionBarActivity

    我目前有一个ActionBarActivity它总是返回一个NoClassDefFoundError 我读到这可能是 ADT 的问题 但我不能确定 因此我提出了问题 我已经从 Android 示例中导入了 ActionBar 示例 andr
  • C++ 从向量中删除对象[重复]

    这个问题在这里已经有答案了 我想从向量中删除一个元素 例如 object that is in the vector MyClass obj vector looks as so vector
  • R:2个不同包中的2个同名函数

    我需要加载到 R 包 tseries 和 chron 两者都有一个名为 is weekend 的函数 我的环境中始终具有我加载的第二个包中的函数 我如何才能始终访问 chron 的功能 您可能已经注意到加载包的顺序会有所不同 即最后加载的包
  • 线程池程序在速度更快的服务器上运行速度要慢得多

    upd我现在认为我的问题的根源不是 线程 因为我观察到程序的任何一点都变慢了 我认为当使用 2 个处理器时 我的程序执行速度会变慢 可能是因为两个处理器需要彼此 通信 我需要做一些测试 我将尝试禁用其中一个处理器 看看会发生什么 我不确定这
  • 使用 C++11 的 CUDA 6.0 的 CMake 脚本

    我正在为我的 CUDA 6 0 Boost 1 55 0 OpenCV 2 4 9 项目开发 64 位 Mac OSX 10 9 使用 makefile 进行编译 但由于我最终将在 64 位 Windows 8 1 上测试它 我想我 熟悉