【问题标题】:How do cuda threads are executed inside a single block?cuda 线程如何在单个块内执行?
【发布时间】:2014-12-01 16:36:20
【问题描述】:

我有几个关于 cuda 的问题。下图取自一本关于并行编程的书。它显示了如何在设备中为两个长度为 8192 的向量相乘分配线程。

1) 在线程块 0 中有 15 个 SIMD 线程。这 15 个线程是并行执行的,还是在特定时间只执行一个线程?

2) 在本例中,每个块包含 512 个元素。这个数字是取决于硬件还是程序员的决定?

【问题讨论】:

    标签: parallel-processing cuda gpu


    【解决方案1】:

    1) 在这个特定的示例中,每个线程似乎都分配给了向量中的 32 个元素。由单个线程执行的代码按顺序执行。

    2) 线程块的大小由程序员决定。但是,考虑到执行代码的硬件,线程块的数量和大小存在限制。有关这方面的更多信息,请参阅这个详尽的答案: Understanding CUDA grid dimensions, block dimensions and threads organization (simple explanation)

    【讨论】:

    • 我不明白第一个问题的答案
    • 今天晚些时候我可以给你一个代码示例,在手机上写代码很乏味。 :)
    • 查Cicada的回答,比这个好。
    【解决方案2】:

    从你的说明看来:

    • 网格由 16 个线程块组成,编号从 0 到 15。
    • 每个块由 16 个“SIMD 线程”组成,编号从 0 到 15
    • 每个“SIMD 线程”计算 32 个向量元素的乘积。

    用 CUDA (OpenCL) 的说法,“SIMD 线程”是否意味着,从插图中不一定很明显:

    • 32 个线程工作项)的warp波前

    或:

    • 一个处理 32 个元素的 线程work-item

    我会假设前者(“SIMD 线程”= warp/wavefront),因为从性能角度来说这是一个更合理的假设,但后者在技术上并不是不正确的,它只是次优设计(至少在当前硬件上) )。


    1) 在线程块 0 中有 15 个 SIMD 线程。这 15 个线程是并行执行的,还是在特定时间只执行一个线程?

    如上所述,线程块 0 中有 16 个线程(编号从 0 到 15,即 16 个),每个线程块由 32 个线程 组成。这些线程同步并行执行。根据底层硬件的功能,warp 彼此独立地执行,顺序或并行。例如,硬件可能能够调度多个 warp 以同时执行。

    2) 在本例中,每个块包含 512 个元素。这个数字是取决于硬件还是程序员的决定?

    在这种情况下,这只是程序员的决定,但在某些情况下,也存在可能迫使程序员更改设计的硬件限制。例如,一个块可以处理的最大线程数,一个网格可以处理的最大块数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 2012-11-29
      • 2013-04-02
      • 2022-12-05
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多