OpenCL 和 CUDA 中的持久线程

2023-11-23

我读过一些关于 GPGPU 的“持久线程”的论文,但我不太理解它。任何人都可以给我一个例子或向我展示这种编程方式的使用吗?

在阅读和谷歌搜索“持久线程”后,我脑子里记住的是:

持久线程只不过是一个 while 循环,可以保持线程运行并计算大量工作。

它是否正确?提前致谢

参考:http://www.idav.ucdavis.edu/publications/print_pub?pub_id=1089 http://developer.download.nvidia.com/GTC/PDF/GTC2012/PresentationPDF/S0157-GTC2012-Persistent-Threads-Computing.pdf


CUDA 利用单指令多数据 (SIMD) 编程模型。计算线程以块的形式组织,并且线程块被分配给不同的流多处理器(SM)。 SM 上线程块的执行是通过将线程排列在warps of 32线程:每个线程束以锁步方式运行并准确执行 对不同数据的相同指令。

一般来说,为了填满 GPU,内核会启动更多的块,这些块实际上可以托管在 SM 上。由于并非所有块都可以托管在 SM 上,因此工作调度程序会在块完成计算时执行上下文切换。应该注意的是,块的切换完全由调度程序在硬件中管理,程序员无法影响块如何调度到 SM 上。这暴露了所有那些不完全适合 SIMD 编程模型并且存在工作不平衡的算法的局限性。确实是一个块A不会被另一个块取代B在同一个 SM 上,直到块的最后一个线程A将尚未完成执行。

尽管 CUDA 没有向程序员公开硬件调度程序,持久线程style 通过依赖工作队列绕过硬件调度程序。当一个块完成时,它会检查队列中是否有更多工作,并继续这样做,直到没有剩余工作,此时该块将退出。通过这种方式,内核启动时会使用与可用 SM 数量相同的块。

The 持久线程下面的示例可以更好地说明该技术,该示例取自演示文稿

“GPGPU”计算和CUDA/OpenCL编程模型

论文中提供了另一个更详细的示例

了解 GPU 上光线遍历的效率

// Persistent thread: Run until work is done, processing multiple work per thread
// rather than just one. Terminates when no more work is available

// count represents the number of data to be processed

__global__  void persistent(int* ahead, int* bhead, int count, float* a, float* b)
{
    int local_input_data_index, local_output_data_index;
while ((local_input_data_index = read_and_increment(ahead)) <   count)
{                                   
        load_locally(a[local_input_data_index]);

        do_work_with_locally_loaded_data();

        int out_index = read_and_increment(bhead);

        write_result(b[out_index]);
    }
}

// Launch exactly enough threads to fill up machine (to achieve sufficient parallelism 
// and latency hiding)
persistent<<numBlocks,blockSize>>(ahead_addr, bhead_addr, total_count, A, B);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCL 和 CUDA 中的持久线程 的相关文章

  • 加速Cuda程序

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • 如何在 C 中将向量参数传递给 OpenCL 内核?

    我在将向量类型 uint8 参数从 C 中的主机代码传递到 OpenCL 内核函数时遇到问题 在主机中 我将数据存储在数组中 cl uint dataArr 8 1 2 3 4 5 6 7 8 我的真实数据不仅仅是 1 8 这只是为了便于解
  • 在内核 OpenCL 中实现 FIFO 的最佳方法

    目标 在 OpenCL 中实现下图所示 OpenCl 内核所需的主要内容是将系数数组和临时数组相乘 然后最后将所有这些值累加为 1 这可能是最耗时的操作 并行性在这里非常有帮助 我正在为内核使用一个辅助函数来执行乘法和加法 我希望这个函数也
  • Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

    我已经在我的ubuntu上安装了cuda 6 5 我的显卡是 GTX titan 当我想要制作 cuda 样本之一时 模拟 粒子 我收到这条消息 gt gt gt WARNING libGLU so not found refer to C
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • OpenCL 与 OpenMP 性能对比 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有研究比较 OpenCL 与 OpenMP 的性能 具体来说 我对使用 OpenCL 启动线程的开销成本感兴趣 例如 如果将域分解
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • TensorFlow的./configure在哪里以及如何启用GPU支持?

    在我的 Ubuntu 上安装 TensorFlow 时 我想将 GPU 与 CUDA 结合使用 但我却停在了这一步官方教程 http www tensorflow org get started os setup md 这到底是哪里 con
  • 如何运行和理解CUDA Visual Profiler?

    我已经设置了 CUDA 5 0 并且我的 CUDA 项目运行良好 但我不知道如何使用 Visual Profiler 分析我的 CUDA 项目 如何运行它 我还需要安装更多吗 又该如何做呢 我的电脑使用Window 7 64位 CUDA 5
  • OS X 10.8 上的 PyCuda / 多处理问题

    我正在开发一个项目 将计算任务分配给多个 python 进程 每个进程都与其自己的 CUDA 设备关联 生成子进程时 我使用以下代码 import pycuda driver as cuda class ComputeServer obje
  • cuda 文件组织的有效方式:.cpp .h .cu .cuh .curnel 文件

    cuda最容易理解 最高效的代码组织是什么 经过一番调查后 我发现 cuda 函数声明应位于 cuh 文件中 实现位于 cu 文件中 内核函数实现位于 curnel 文件中 其他 C 内容通常在 cpp 和 h 文件中 最近我发布了一个问题
  • 尽管有障碍,Open CL 仍不同步

    我刚刚开始通过 Python 的 PyOpenCL 接口使用 OpenCL 我尝试创建一个非常简单的 循环 程序 其中每个内核中每个循环的结果取决于上一个循环周期的另一个内核的输出 但我遇到了同步问题 kernel void part1 g
  • 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
  • cudaDeviceScheduleBlockingSync 和 cudaDeviceScheduleYield 之间有什么区别?

    正如这里所说 如何减少 CUDA 同步延迟 延迟 https stackoverflow com questions 11953722 how to reduce cuda synchronize latency delay 等待设备结果有
  • Bank 在字长方面存在冲突

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

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • Tensorflow 训练期间 GPU 使用率非常低

    我正在尝试为 10 类图像分类任务训练一个简单的多层感知器 这是 Udacity 深度学习课程作业的一部分 更准确地说 任务是对各种字体呈现的字母进行分类 数据集称为 notMNIST 我最终得到的代码看起来相当简单 但无论如何我在训练期间
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • CUDA 添加矩阵的行

    我试图将 4800x9600 矩阵的行加在一起 得到一个 1x9600 的矩阵 我所做的是将 4800x9600 分成 9 600 个矩阵 每个矩阵长度为 4800 然后我对 4800 个元素进行缩减 问题是 这真的很慢 有人有什么建议吗

随机推荐

  • PowerShell 脚本错误:字符串缺少终止符:

    非常简单的powershell脚本 Server side storage copy SourceStorageAccount myStorageAccount SourceStorageKey myKey SourceStorageCon
  • 如何解决上传项目到 GitHub 时“拒绝合并不相关历史记录”的问题?

    我已经安装了GitHub 桌面版和 Windows 机器上的 Git 我有一个 GitHub 帐户并创建了一个虚拟存储库 当我打算通过以下方式上传我的包裹时Git Bash命令行 它失败并出现错误 fatal refusing to mer
  • 有哪些好的科技播客?

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 是的 播客 那些我可以在上班路上听的好听的小有声读物 就目前的播客数量而言 这就像大海捞针一样 只不过大海捞针恰好是互联网 并且充
  • $_GLOBAL 、 $_POST 等全局变量存储在哪里?

    我参加面试的时候 面试官问了我这个问题 他们使用的是堆 堆栈等内存 我用谷歌搜索但没有得到任何明确的答案 好吧 既然你标记了C 我就从这个开始吧 在 C 运行时中 全局变量存储在两个位置之一 数据段或BSS段 确定某一特定变量属于哪一个变量
  • Recyclerview 在滚动期间更改项目

    我有一个 RecyclerView 每行都有一个播放按钮 文本视图和进度条 当单击播放按钮时必须播放我的 SD 卡中的音频并且必须进度条 问题是 当我向下滚动 recyclerview 时 会更改下一行中的进度条 这意味着我可以一次在屏幕上
  • Android AudioTrack 混合的示例代码

    我的资源文件夹中有两个 PCM 声音文件 我使用输入流并将它们转换为字节数组 然后我通过标准化并添加 music1 和 music2 来处理它们 并将其输出到字节数组输出 最后 放置输出数组并将其馈送到 AudioTrack 显然 我什么也
  • 当且仅当 Python 不存在时才安全地创建文件

    我希望根据该文件是否已存在来写入该文件 仅在该文件尚不存在时写入 实际上 我希望继续尝试文件 直到找到不存在的文件 以下代码显示了潜在攻击者可以插入符号链接的方法 如中所建议的这个帖子在文件测试和正在写入的文件之间 如果代码以足够高的权限运
  • 换位表会导致搜索不稳定吗

    我正在编写一个国际象棋引擎 最近添加了一个换位表 在运行一些测试时 我发现虽然搜索仍然返回相同的最佳移动 但移动的价值 对于最大化玩家来说有多好 波动 这是转置表的正常行为吗 我记得读到转置表可能会导致搜索不稳定 是这个意思吗 那么这是我的
  • 我在 python lambda 处理程序中找不到回调参数

    我正在学习 aws lambda lex 我发现了带有 node js 的咖啡机器人示例代码 Main handler in node js Route the incoming request based on intent The JS
  • 可以将 LPTSTR 转换为 BSTR 吗?

    将 LPTSTR 直接转换为 BSTR 是否合法 根据我的对BSTR的理解 直接将 LPTSTR 转换为 BSTR 将会留下损坏的长度前缀 示例代码明确指出字符串文字不能存储到 BSTR 任何人都可以帮我确认 LPTSTR LPCTSTR
  • Indy TIdHTTP 发布问题

    我在向亚马逊发帖时遇到问题SES使用 Indy 的 TIdHTTP 的服务 这是我正在使用的代码的示例 procedure TMainFrm btnAmazonSESClick Sender TObject var SSLHandler T
  • Python 中的信号处理程序和日志记录

    日志记录模块的文档说 如果您使用信号模块实现异步信号处理程序 则可能无法在此类处理程序中使用日志记录 这是因为线程模块中的锁实现并不总是可重入的 因此不能从此类信号处理程序中调用 这表明不应从信号处理程序直接或间接调用的代码中进行日志记录调
  • Dagger 2 在多个实例中单例

    我刚刚测试了 Dagger 2 并且在单例注释方面出现了一些奇怪的行为 我创建了一些测试代码来显示我的问题 我的模块 Module public class App Provides Singleton ThingA provideThin
  • 如何在客户端中返回 Meteor.call() 的值?

    所以我一直在使用带有 MeteorJS 的 twitter API 我想做的只是在浏览器上显示 twitter 用户的屏幕名称 这是我到目前为止所做的 Meteor methods screenName function T get sea
  • 什么是静态构造函数?

    在一次采访中有人问我这个问题 什么是静态构造函数 C 中存在吗 如果是 请举例说明 C 没有静态构造函数 但您可以使用嵌套类的静态实例来模拟它们 class has static constructor friend class const
  • 如何设置 Selenium Python WebDriver 默认超时?

    尝试找到一种好方法来设置 Selenium Python WebDriver 中命令执行延迟的最大时间限制 理想情况下 类似 my driver get my driver my driver set timeout 30 seconds
  • IFrame 破坏文件 - 它们的用途是什么?

    在查看一些广告公司 DoubleClick Atlas 时 我遇到了 iframe Buster 文件的概念 这些文件与广告发布商托管在同一主机上 一个示例 http www adopstools com ibusters atlas at
  • CakePhp 中的 unbindModel 调用。它是如何工作的?

    蛋糕中unbindModel是如何发生的 this gt User gt unbindModel array hasAndBelongsToMany gt array Friend 我在函数的开头写了这个 但它仍然质疑 朋友 模型 函数中间
  • 在opencv python中创建透明图像

    我正在尝试制作一个透明图像并在其上绘图 然后在基础图像上添加加权 如何在 openCV python 中初始化具有宽度和高度的完全透明图像 编辑 我想制作像 Photoshop 中一样的效果 具有图层堆叠 所有堆叠图层最初都是透明的 并且在
  • OpenCL 和 CUDA 中的持久线程

    我读过一些关于 GPGPU 的 持久线程 的论文 但我不太理解它 任何人都可以给我一个例子或向我展示这种编程方式的使用吗 在阅读和谷歌搜索 持久线程 后 我脑子里记住的是 持久线程只不过是一个 while 循环 可以保持线程运行并计算大量工