运行时 GPU 执行还是 CPU 执行?

2023-12-09

我觉得必须有一种方法来编写代码,使其可以在 CPU 或 GPU 中运行。也就是说,我想编写一些具有(例如)CPU FFT 实现的东西,如果没有 GPU,该实现可以执行,但当 GPU 存在时默认为 GPU FFT。我无法提出正确的问题来让互联网提供解决方案。

我的应用程序目标有可用的 GPU。我们想要编写某些函数来使用 GPU。然而,我们的开发虚拟机却是另一回事。能够运行代码/单元测试周期而无需跳转到 GPU 硬件似乎是非常理想的。

如果我需要进行一些巧妙的运行时检查/库加载,我可以接受;我只需要一本食谱。

人们如何持续集成支持 GPU 的代码?

目标环境是nVidia/CUDA。我是 GPU 代码的新手,所以也许这是一个常见问题解答(但我还没有找到)。


我想要的是运行时“我有 GPU 吗?”切换,以便我可以采用一个代码路径或另一个

我相信这应该非常简单。

典型的方法是:

  1. 将您的代码静态链接到 CUDA 运行时库 (cudart) 库。如果你编译nvcc,这是默认行为。

  2. (大概)在代码开头附近,选择 CUDA Runtime API 调用,例如cudaGetDevice()。使用某种形式的正确的 CUDA 错误检查(无论如何,总是一个好主意)。在这种情况下,我们将使用第一个运行时 API 调用返回的错误来做出路径决策(而不是简单地终止应用程序)。

  3. 如果上面步骤 2 中的运行时 API 调用返回cudaSuccess(作为功能返回值,而不是设备索引),那么可以安全地假设至少有 1 个功能 CUDA GPU。在这种情况下,如果需要的话,可以对环境进行进一步检查,也许遵循类似于 CUDA 的顺序deviceQuery示例代码。此状态可以存储在您的程序中,以便将来做出有关要遵循的代码路径的决策。

  4. 如果步骤 2 中的运行时 API 调用返回除cudaSuccess,这几乎肯定意味着 CUDA 不起作用,可能是因为没有 CUDA GPU。在这种情况下,我建议不要进一步使用任何 CUDA API 或库,并且从那里您的代码应该使用仅主机代码路径。

这是一个完整的示例。如果找到可用的 CUDA 环境,它会使用 CUFFT 库执行简单的 FFT 操作。否则,它使用 FFTW 在主机代码中执行相同的操作。请注意,除了静态链接 cudart 库(默认使用nvcc,所以不明显),我也静态链接 CUFFT 库。至少在 Linux 上(如此处的示例所示),这可以防止应用程序启动时因无法找到要链接的动态库而失败(这将阻止应用程序运行;而在这种情况下,我们的意图是应用程序运行但选择主机代码路径)。

$ cat t467.cu
#include <cufft.h>
#include <fftw.h>
#include <iostream>

int main(){

  double data[] = {0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f};
  int N = sizeof(data)/sizeof(data[0]);
  int dev = 0;
  if (cudaGetDevice(&dev) == cudaSuccess) {
    // GPU code path
    cufftDoubleComplex *din, *dout, *in, *out;
    in  = new cufftDoubleComplex[N];
    out = new cufftDoubleComplex[N];
    for (int i = 0; i < N; i++) in[i].x = data[i];
    cudaError_t err = cudaMalloc(&din,  sizeof(din[0]) * N);
                err = cudaMalloc(&dout, sizeof(din[0]) * N);
    cufftHandle plan;
    cufftResult cstat = cufftPlan1d(&plan, N, CUFFT_Z2Z, 1);
    cudaMemcpy(din, in, N*sizeof(din[0]), cudaMemcpyHostToDevice);
    cstat = cufftExecZ2Z(plan, din, dout, CUFFT_FORWARD);
    cudaMemcpy(out, dout, N*sizeof(din[0]), cudaMemcpyDeviceToHost);
    for (int i = 0; i < N; i++) data[i] = out[i].x * out[i].x + out[i].y * out[i].y;
    cudaFree(din); cudaFree(dout);
    delete[] in;  delete[] out;
    cufftDestroy(plan);
    std::cout << "GPU calculation: " << std::endl;
    }
  else {
    // CPU code path
    fftw_complex *in, *out;
    fftw_plan p;
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    for (int i = 0; i < N; i++) {in[i].re= data[i]; in[i].im = 0;}
    p = fftw_create_plan(N, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_one(p, in, out);
    fftw_destroy_plan(p);
    for (int i = 0; i < N; i++) data[i] = out[i].re * out[i].re + out[i].im * out[i].im;
    fftw_free(in); fftw_free(out);
    std::cout << "CPU calculation: " << std::endl;
    }
  for (int i = 0; i < N; i++)
    std::cout << data[i] << ", ";
  std::cout << std::endl;
  return 0;
}
$ nvcc t467.cu -o t467 -lcufft_static -lculibos -lfftw -lm
$ ./t467
GPU calculation:
0, 0, 16, 0, 0, 0, 16, 0,
$ CUDA_VISIBLE_DEVICES="" ./t467
CPU calculation:
0, 0, 16, 0, 0, 0, 16, 0,
$

请注意,上面的示例仍然动态链接 fftw,因此您的执行环境(CPU 和 GPU)需要有适当的 fftwX.so 库可用。如何使 Linux 可执行文件在各种设置(CUDA 依赖项之外)下工作的一般过程超出了本示例的范围或我打算回答的范围。在Linux上,ldd是你的朋友。

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

运行时 GPU 执行还是 CPU 执行? 的相关文章

  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • “gld/st_throughput”和“dram_read/write_throughput”指标之间有什么区别?

    在 CUDA 可视化分析器版本 5 中 我知道 gld st requested throughput 是应用程序请求的内存吞吐量 然而 当我试图找到硬件的实际吞吐量时 我很困惑 因为有两对似乎合格的指标 它们是 gld st throug
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • cuda 文件组织的有效方式:.cpp .h .cu .cuh .curnel 文件

    cuda最容易理解 最高效的代码组织是什么 经过一番调查后 我发现 cuda 函数声明应位于 cuh 文件中 实现位于 cu 文件中 内核函数实现位于 curnel 文件中 其他 C 内容通常在 cpp 和 h 文件中 最近我发布了一个问题
  • CUDA 5.0错误LNK2001:cuda方法无法解析的外部符号

    我的链接器有错误 1 gt ManifestResourceCompile 1 gt All outputs are up to date 1 gt kernel cu obj error LNK2001 unresolved extern
  • 云或烟雾的粒子系统

    我正在尝试使用 OpenGL 和 CUDA 制作一个简单的用于云和烟雾模拟的粒子系统 如何使粒子系统中的粒子表现得像真正的云或烟雾在低湍流风中的表现 我现在遇到的一些问题是 颗粒聚集成一个大球 粒子扩散到无限远 粒子突然弹射离开 我已经完成
  • Bank 在字长方面存在冲突

    我读过一些关于共享内存的好文章 但我对银行冲突有初步疑问 据说 如果线程 1 和线程 2 从存储体 0 访问字 0 则不存在存储体冲突 但如果他们访问不同的单词 就会出现银行冲突 但我的问题是不同的单词如何可以驻留在一个银行中 由于bank
  • 如何在CUDA应用程序中正确应用线程同步?

    一般来说 我在应用程序中偶尔会使用线程同步 因为我并不经常需要此功能 我并不是真正的高级 C C 程序员 但我也不是初学者 我开始学习 CUDA C 对当今 GPU 与 CPU 的能力相比感到兴奋 我意识到 CUDA 编程主要是关于并行线程
  • C 中的 CUDA:如何使用 cudaMemcpyAsync 修复错误 11

    我目前正在尝试使用 CUDA 运行一个简单的多 GPU 程序 它的基本作用是将一个包含一些虚拟数据的大型数组复制到 GPU GPU 进行一些数学计算 然后将结果数组复制回来 我在 VS2017 的输出中没有收到任何错误 但我设置的一些错误消
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • 摆脱异步 cuda 流执行期间的忙等待

    我正在寻找一种方法 如何摆脱以下代码中主机线程中的忙等待 不要复制该代码 它仅显示我的问题的想法 它有许多基本错误 cudaStream t steams S N for int i 0 i lt S N i cudaStreamCreat
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 在 Cuda 中简单添加两个 int,结果始终相同

    我开始了学习Cuda的旅程 我正在玩一些 hello world 类型的 cuda 代码 但它不起作用 我不知道为什么 代码非常简单 取两个整数并将它们添加到 GPU 上并返回结果 但无论我将数字更改为什么 我都会得到相同的结果 如果数学那
  • 如何安装libcusolver.so.11

    我正在尝试安装 Tensorflow 但它要求 libcusolver so 11 而我只有 libcusolver so 10 有人可以告诉我我做错了什么吗 这是我的 Ubuntu nvidia 和 CUDA 版本 uname a Lin
  • 如何从C++头文件调用CUDA文件?

    我知道从 c 文件调用 cu 文件的方法 但现在我想从 C 头文件调用 cu 文件 有可能做到吗 如果是这样 我应该如何设置我的项目 请帮忙 这是一个有效的例子 file1 h int hello file2 h include
  • cudaMalloc使用向量>进行管理 > C++ - NVIDIA CUDA

    我正在通过 NVIDIA GeForce GT 650M GPU 为我创建的模拟实现多线程 为了确保一切正常工作 我创建了一些辅助代码来测试一切是否正常 在某一时刻 我需要更新变量向量 它们都可以单独更新 这是它的要点 device int
  • 一维纹理内存访问比一维全局内存访问更快吗?

    我正在测量标准纹理和 1Dtexture 内存访问之间的差异 为此 我创建了两个内核 global void texture1D float doarray int size int index calculate each thread
  • 如何强制tensorflow使用所有可用的GPU?

    我有一个 8 GPU 集群 当我运行Kaggle 的一段 Tensorflow 代码 https www kaggle com keegil keras u net starter lb 0 277 scriptVersionId 2164
  • nvidia GPU 上的内核真的有超时吗?

    寻找为什么我的内核产生奇怪的错误消息或仅 0 结果的答案我发现了这个answer https stackoverflow com questions 3988645 cl out of resources for 2 millions fl

随机推荐

  • python 按周或月分割 pandas 数据框,并根据这些 sp 对数据进行分组

    DateOccurred CostCentre TimeDifference 03 09 2012 2073 28138 03 09 2012 6078 34844 03 09 2012 8273 31215 03 09 2012 8367
  • Pandas 在读取 CSV 之前忽略前几行

    我正在使用 Pandas 库和 Python 我有一个 Excel 文件 在 Excel 工作表的顶部有一些标题信息 我不需要这些信息来提取数据 但是 标题信息可能需要更长的行 因此无法预测它有多长 所以 我的数据提取应该从 ID 的地方开
  • 从基础模块调用动态特征代码

    我试图实现一个动态功能 从我的基本模块中我应该调用该功能中的一些方法 但它只能从该功能中调用基本方法 有什么方法可以使功能代码从基本模块访问 我了解未安装功能时会发生什么 我已经使用默认的谷歌文档实现了它 所以我没有不同的代码或实现 今天没
  • 在r中使用read_csv导入多个csv文件

    我有一个包含多个 csv 文件名称的向量 library readr data lt c categories csv customers csv employees csv employee territories csv order d
  • InternalsVisibleTo 属性不起作用

    我正在尝试使用InternalsVisibleToassembly 属性 使 NET 类库中的内部类对我的单元测试项目可见 由于某种原因 我不断收到一条错误消息 MyClassName 由于其保护级别而无法访问 两个程序集都已签名 并且我在
  • 将表单结果从联系表单 7 导出到 PDF (fPDF)

    我正在尝试将用户在 WordPress 中的联系表单 7 中输入的值通过 fpdf 导出为 PDF 这就是我所设置的 我可以生成 PDF 但没有从表单动态生成的值 函数 php add action wpcf7 before send ma
  • 角度 $setPristine() 不起作用

    我正在尝试使用 Angular 的内置表单函数 特别是setPristine 清除用户提交时的表单 我的控制器可以访问 scope newForm 我的形式 及其所有方法 但正在运行 scope newForm setPristine 没有
  • Stringify C 预处理器

    这是我的第一篇文章 所以如果我太含糊或提供了每个人都会直观地假设的信息 请告诉我 我对写作很陌生C我只是想更好地了解预处理 我正在编写一个简单的程序 可以使用直接从控制台接收参数gcc Wall std c99 DSEED argument
  • 如何在 JFreechart 中获取点的菱形形状

    我需要在 JFreechart 中的时间序列上获得 A 菱形形状 但我无法做到这一点 有人可以指导应该在下面的代码中添加哪些代码来实现钻石形状点以及如何更改线条的颜色吗 该程序使用 rs 和 stmt 以及其他从数据库派生并在其他地方定义的
  • Firebase 实时数据库写入/上传数据是否收费?

    还有一个问题与这个类似here 但答案并不能满足我的问题 我具体询问实时数据库中的写入操作 我知道读取 下载将被计费 但是 那实时定价没有提到 上传 或 写入 它只提到 下载 存储和同时连接 但是上传 又名写入 怎么样 这是否意味着它是免费
  • 创建参考 y 值的垂直堆叠条形图(岩性/地层柱)

    我想制作一个堆积条形图 其中 y axis md litho x axis litho 数据 我已经尝试使用我修改过的代码来实现它另一个问题在堆栈溢出上 path pd ExcelFile F Backup JN Litologi lito
  • 在 Javascript 中覆盖 undefined 和 IIFE

    我一直在阅读 你不懂Js 系列 并发现了这一点 此模式的另一个应用解决了默认值的 次要利基 问题undefined标识符的值可能会被错误地覆盖 从而导致意外结果 通过命名参数undefined 但不为该参数传递任何值 我们可以保证undef
  • 单击“管理解决方案的 nuget 包”Visual Studio 2015 时 Nuget 包管理器崩溃

    因此 当单击 管理解决方案的 nuget 包 按钮时 我的 Visual Studio 崩溃了 如果我选择调试我会收到此消息 PresentationFramework dll 中发生 System Windows Markup XamlP
  • 之间的区别

    当我使用malloc在 C 程序中 我收到警告 warning incompatible implicit declaration of built in function malloc enabled by default 然后我可以包括
  • 用于提取特定 XML 标记值的批处理文件

    我需要一个批处理文件来检索Data仅标记值 不带标记名称 并将其写入 txt 文件 该文件可能具有比列出的更多的 XML 标签 所以输出应该是 资本收益是美国收入差距的关键因素 而胜利者背后的力量是我们经济体系的全部准则 如果您想平衡在美国
  • 使用 EL 和 JSTL 访问枚举值

    我有一个名为 Status 的枚举 定义如下 public enum Status VALID valid OLD old private final String val Status String val this val val pu
  • Spring - 如何对单个资源应用投影?

    我正在尝试对名为的实体类应用投影Institute 我定义了以下投影类 Projection name instituteProjection types Institute class public interface Institute
  • 使用 I-Beacon 的室内导航 - 准确性正在迅速变化

    我正在使用 I Beacon 做一个室内导航应用程序 为此 我使用信标给出的精度 但情况正在迅速改变 由于该值正在变化 因此即使当我处于静态时 必须计算的用户位置的 X 和 Y 坐标也会变化 因此 请帮助我在我不移动时使精度保持不变 提前致
  • 在 Java 中如何在修改对象时迭代该对象? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 高效相当于在迭代集合时进行删除 在java中迭代集合时从集合中删除项目 我正在尝试循环HashMap Map
  • 运行时 GPU 执行还是 CPU 执行?

    我觉得必须有一种方法来编写代码 使其可以在 CPU 或 GPU 中运行 也就是说 我想编写一些具有 例如 CPU FFT 实现的东西 如果没有 GPU 该实现可以执行 但当 GPU 存在时默认为 GPU FFT 我无法提出正确的问题来让互联