CUDA编程问题记录:能否用CPU多线程调用CUDA核函数

2023-11-16

问题:能否在主机端创建CPU多线程,在每个线程里调用设备端核函数的caller函数,进而实现进一步的并行运行。
例如有5张图片,对于每张图片都有N个GPU线程对其进行像素操作,但是此时是逐一对这5张图片处理的,想在主机端创建5个CPU线程,每个线程里进行 传输到设备端–>设备端GPU多线程处理–>结果返回主机端 这一系列操作,实现五张图片同时处理

此方法能否实现: 不能

只存在一个流时(默认的流),所有调用核函数的指令将被存在一个队列中,依次执行。因此直接使用CPU多线程调用kernel函数不能达到并行的目的,此时即便能运行也与串行运行的效果相同,只有通过使用多流才能进一步加速。

参考资料
https://stackoverflow.com/questions/13061619/what-happen-if-a-cuda-kernel-is-called-from-multiple-pthreads-simultaneously

Question:
I have a CUDA kernel that do my hard work, but I also have some hard work that need to be done in the CPU (calculations with two positions of the same array) that I could not write in CUDA (because CUDA threads are not synchronous, I need to perform a hard work on a position X of an array and after do z[x] = y[x] - y[x - 1], where y is the array resultant of a CUDA kernel where each thread works on one position of this array and z is another array storing the result). So I’m doing this in the CPU.

I have several CPU threads to do the CPU side work, but each one is calling a CUDA kernel passing some data. My question is: what happens on the GPU side when multiple CPU threads are making GPU calls? Would be better if I do the CUDA kernel call once and then create multiple CPU threads to do the CPU side work?

回答:
Kernel calls are queued and executed one by one in single stream.

However you can specify stream during kernel execution - then CUDA operations in different streams may run concurrently and operations from different streams may be interleaved. Default stream is 0.

See:http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf

Things are similar when different processes use the same card.
Also remember that kernels are executed asynchronously from CPU stuff.

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

CUDA编程问题记录:能否用CPU多线程调用CUDA核函数 的相关文章

  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • Golang调用CUDA库

    我正在尝试从 Go 代码中调用 CUDA 函数 我有以下三个文件 test h int test add void test cu global void add int a int b int c c a b int test add v
  • 阿迪和苏比之间到底是什么“关系”?

    我应该回答这个问题 经过一番研究后发现 add 和 sub 具有相同的操作码 仅在功能领域有所不同 这是答案还是其他什么 Update Nios II CPU 手册中提供了它 subi subtract immediate Operatio
  • libstdc++.so.6 与 cuda 相关的链接器问题

    今天我在链接我编译的 cuda 内容时遇到了问题 我有一个最新的 debian 测试 w 2 6 32 3 amd64 我整天都在写我的代码 不时编译 没有问题 但在进行了较小的代码更改后 我收到以下错误 gcc o pa CUDA o h
  • Cuda Bayer/CFA 去马赛克示例

    我编写了一个 CUDA4 Bayer 去马赛克例程 但它比在 16 核 GTS250 上运行的单线程 CPU 代码慢 块大小是 16 16 图像暗淡是 16 的倍数 但更改此值并不会改善它 我做了什么明显愚蠢的事情吗 calling rou
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连
  • “计算能力”是什么意思? CUDA?

    我是CUDA编程新手 对此了解不多 您能告诉我 CUDA 计算能力 是什么意思吗 当我在大学服务器上使用以下代码时 它向我显示了以下结果 for device 0 device lt deviceCount device cudaDevic
  • 如何优化这个 CUDA 内核

    我已经分析了我的模型 似乎该内核约占我总运行时间的 2 3 我一直在寻找优化它的建议 代码如下 global void calcFlux double concs double fluxes double dt int idx blockI
  • 运行时 API 应用程序中的 cuda 上下文创建和资源关联

    我想了解如何在 cuda 运行时 API 应用程序中创建 cuda 上下文并与内核关联 我知道这是由驱动程序 API 在幕后完成的 但我想了解一下创作的时间线 首先 我知道 cudaRegisterFatBinary 是第一个 cuda a
  • 大师系统要求

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 使用 CUDA 进行逐元素向量乘法

    我已经在 CUDA 中构建了一个基本内核来执行逐元素两个复向量的向量 向量乘法 内核代码插入如下 multiplyElementwise 它工作正常 但由于我注意到其他看似简单的操作 如缩放向量 在 CUBLAS 或 CULA 等库中进行了
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • CPU 周期与总 CPU 时间

    在 Windows 上 GetProcessTimes 和 QueryProcessCycleTime 可用于获取应用程序所有线程的总计 我期望 显然是天真地 找到总周期数和总处理器时间 用户 内核 之间的比例关系 当转换为相同的单位 秒
  • 将 nvidia 运行时添加到 docker 运行时

    我正在运行虚拟机GCP配备特斯拉 GPU 并尝试部署一个PyTorch基于应用程序使用 GPU 加速 我想让 docker 使用这个 GPU 可以从容器访问它 我设法在主机上安装了所有驱动程序 并且该应用程序在那里运行良好 但是当我尝试在
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • “gld/st_throughput”和“dram_read/write_throughput”指标之间有什么区别?

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

随机推荐

  • 100天精通Python(数据分析篇)——第73天:Pandas文本数据处理方法之查找、替换、拼接、正则、虚拟变量

    文章目录 每篇前言 一 Python字符串内置方法 1 文本查找 2 文本替换 3 文本拼接 4 正则提取 二 Pandas实现文本查找 1 str startswith 字符串 2 str endswith 字符串 3 str index
  • java.lang.IllegalStateException: Failed to load property source

    java lang IllegalStateException Failed to load property source from file H codes20210804 nacos demo provider target clas
  • Mybatis-plus中BaseMapper具体方法说明

    一 BaseMapper方法详解 1 Insert 插入一条记录 int insert T entity 2 Delete 根据 entity 条件 删除记录 int delete Param Constants WRAPPER Wrapp
  • NVIDIA-SMI系列命令总结

    1 NVIDIA SMI介绍 nvidia smi简称NVSMI 提供监控GPU使用情况和更改GPU状态的功能 是一个跨平台工具 它支持所有标准的NVIDIA驱动程序支持的Linux发行版以及从WindowsServer 2008 R2开始
  • 2024年java面试--mysql(4)

    系列文章目录 2024年java面试 一 spring篇 2024年java面试 二 spring篇 2024年java面试 三 spring篇 2024年java面试 四 spring篇 2024年java面试 集合篇 2024年java
  • Shopify商品置顶功能

    Shopify商品置顶功能 商品置顶功能描述 通过在商品列表页为链接添加参数的方法实现置顶某个或多个商品的功能 需按以下步骤将目标代码添加到目标位置 目标代码 assign handles assign handleSize 0 if cu
  • RabbitMQ启动没有端口号解决问题

    docker启动容器时报 Failed to create thread Operation not permitted 1 原因 docker内的用户权限受限 解决办法1 启动docker时加上参数 privileged true pri
  • 【空气检测仪专题】10.增加电池显示

    10 增加电池显示 增加了电池电量显示和充电电池动画 增加PM2 5传感器 并显示实时数据 效果如下图
  • Allegro 镜像丝印处理

    本文问题描述 Allegro 设计中丝印镜像了 在器件在正面 丝印也在正面 但是不管怎么 R 都转不过来 发现其实丝印已经被镜像至反面 可能也就需要简单左右镜像下 就可以了 如下图 艹作 在菜单栏点击view 选择Flip Design 点
  • PB(PowerBuilder)如何同消息队列(RabbitMQ)通讯

    参考文档 1 RabbitMQ入门 用途说明和深入理解 RabbitMQ入门 用途说明和深入理解 走错路的程序员的博客 CSDN博客 2 RabbitMQ进阶 管理 配置 RabbitMQ进阶 管理 配置 东孤熊猫的博客 CSDN博客 ap
  • Allegro16.6详细教程(四)

    2 PIN的定義 如果用第一種方式產生Netlist的話 就要對於一些Power pin加以定義 1 滑鼠點選想定義的零件 2 點選選單中Edit gt Part 3 用滑鼠點選想定義的Pin腳 4 點選功能表中Edit gt Proper
  • RCE 远程命令代码执行漏洞

    什么是REC Remote Command Code Execute 远程命令或者代码执行 通过构造特殊的字符串 将数据提交到WEB应用程序 并利用该方式外部程序或命令进行攻击 类似SQL注入 Web应用程序使用了一些可以执行系统命令 或者
  • DNS污染与DNS劫持

    先认识一下什么是DNS DNS 是域名系统 Domain Name System 的缩写 在Internet上域名与IP地址之间是一对一 或者多对一 的 域名虽然便于人们记忆 但机器之间只能互相认识IP地址 它们之间的转换工作称为域名解析
  • Linux 中的 chkconfig 命令及示例

    先决条件 Linux 中的运行级别 chkconfig命令用于列出所有可用的服务并查看或更新其运行级别设置 简而言之 它用于列出服务或任何特定服务的当前启动信息 更新服务的运行级别设置以及在管理中添加或删除服务 概要 chkconfig l
  • 小程序限制PC端打开 只可以在手机端打开的解决方案

    电脑版微信是支持运行小程序的 但是某一些小程序是限制在PC上打开的 那么是怎么判断打开的设备是否是Pc端呢 官方文档给出的方案是 wx getSystemInfo success res console log res model cons
  • 【Fiddler】利用FiddlerScript实现自制函数功能及一些基本实用函数。

    目录 前言 一 FiddlerScript是什么 二 代码部分 1 自定义功能函数名 2 实现Session的遍历 3 实现重发请求并选中新请求 4 常用FS函数 5 Fiddler中的延时器 总结 前言 关于FS Fiddler是我们熟悉
  • 怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制

    怎样打造一个分布式数据库 rocksDB raft mvcc 本质上是为了解决跨数据中心的复制 摘自 http www infoq com cn articles how to build a distributed database ut
  • Windows下jsp运行环境的配置方案

    Windows下jsp运行环境的配置方案 lt 一 gt 配置前的准备工作 软件名称 j2sdk 安装包名称 j2sdk 1 4 2 windows i586 exe 下载地址 http java sun com 软件名称 Jakarta
  • MySQL -调整列的约束

    调整列的完整性约束 主键PK 外键FK和 唯一键UK 1 新增 1 新建class表 列不设置约束 mysql gt create table class id int name varchar 64 teacher varchar 64
  • CUDA编程问题记录:能否用CPU多线程调用CUDA核函数

    问题 能否在主机端创建CPU多线程 在每个线程里调用设备端核函数的caller函数 进而实现进一步的并行运行 例如有5张图片 对于每张图片都有N个GPU线程对其进行像素操作 但是此时是逐一对这5张图片处理的 想在主机端创建5个CPU线程 每