CUDA线程是否在O(n)操作的锁定步骤中执行?

CUDA线程是否在O(n)操作的锁定步骤中执行?,cuda,Cuda,《CUDA编程指南》中有以下内容: warp一次执行一条公共指令,因此,当warp的所有32个线程在其执行路径上一致时,就可以实现完全的效率。如果扭曲的线程通过依赖于数据的条件分支发散,则扭曲会串行执行所采用的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成时,线程会收敛回同一执行路径 我之所以考虑使用lockstep,是因为一次只能使用一条普通指令 那么,如果没有分支,每个线程都需要计算一个O(n)操作,那么会发生什么呢 如果它们所操作的数据值较小,那么扭曲中的某些线程不会比其他线程先

《CUDA编程指南》中有以下内容:

warp一次执行一条公共指令,因此,当warp的所有32个线程在其执行路径上一致时,就可以实现完全的效率。如果扭曲的线程通过依赖于数据的条件分支发散,则扭曲会串行执行所采用的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成时,线程会收敛回同一执行路径

我之所以考虑使用lockstep,是因为一次只能使用一条普通指令

  • 那么,如果没有分支,每个线程都需要计算一个O(n)操作,那么会发生什么呢
  • 如果它们所操作的数据值较小,那么扭曲中的某些线程不会比其他线程先完成吗
  • 如果某些线程在其他线程之前完成,那么在其他线程完成之前,它们是否保持空闲状态

  • warp中的每一条指令都是在锁定步骤中执行的。只有在前一条指令完成后,才能提取下一条指令。 如果指令需要不同线程的不同时间(例如,一个线程从缓存加载数据,而另一个线程等待全局内存读取),则所有线程都必须等待

    也就是说,我不知道有哪一条指令具有复杂性
    O(n)
    。您可能指的是一个大小为
    n
    的循环,由扭曲中的每个线程执行。循环和任何其他控制流构造一样,具有条件跳转。提前退出循环的线程将被屏蔽,并等待仍在循环中的线程。当所有线程发出要退出的信号时,它们会聚在一起,下面的操作再次以完美同步的方式执行


    更新:正如@knedlsepp所指出的(谢谢!),因为沃尔塔说的不是真的。GPU可以将翘曲分割成更小的片段并独立运行,从而打破锁定步骤。你不应该假设得太多,但扭曲同步原始性可能会有所帮助

    在实践中,GPU仍将尽可能在锁定步骤中运行整个warp,因为这是最有效的。据我所知(虽然我不能再坚定地证实,有人可能会证明我错了),仍然有一条指令同时被执行,但现在可以在时间上交错具有不同掩码的不同分支。对于一个复杂的控制流,甚至可能发生同一个分支被多次执行,使用不同的掩码


    我记得我将基于CUDA的光线跟踪器加速了2-3次,当时我消除了所有
    break
    和mid function
    return
    语句,这些语句对于编译器找出最佳控制流和掩蔽是有问题的。

    warp中的每一条指令都是在锁定步骤中执行的。只有在前一条指令完成后,才能提取下一条指令。 如果指令需要不同线程的不同时间(例如,一个线程从缓存加载数据,而另一个线程等待全局内存读取),则所有线程都必须等待

    也就是说,我不知道有哪一条指令具有复杂性
    O(n)
    。您可能指的是一个大小为
    n
    的循环,由扭曲中的每个线程执行。循环和任何其他控制流构造一样,具有条件跳转。提前退出循环的线程将被屏蔽,并等待仍在循环中的线程。当所有线程发出要退出的信号时,它们会聚在一起,下面的操作再次以完美同步的方式执行


    更新:正如@knedlsepp所指出的(谢谢!),因为沃尔塔说的不是真的。GPU可以将翘曲分割成更小的片段并独立运行,从而打破锁定步骤。你不应该假设得太多,但扭曲同步原始性可能会有所帮助

    在实践中,GPU仍将尽可能在锁定步骤中运行整个warp,因为这是最有效的。据我所知(虽然我不能再坚定地证实,有人可能会证明我错了),仍然有一条指令同时被执行,但现在可以在时间上交错具有不同掩码的不同分支。对于一个复杂的控制流,甚至可能发生同一个分支被多次执行,使用不同的掩码


    我记得我将基于CUDA的光线跟踪器加速了2-3次,当时我消除了所有
    break
    和mid function
    return
    语句,这些语句对于编译器找出最佳控制流和掩蔽是有问题的。

    Guide指的是O(1)(至少在理论上)的具体机器指令。O(n)操作由机器指令组成。为了使扭曲中的线程在其他线程之前完成,您需要为它们提供不同的数据。这只有在分支上才可能(除非我在这里错了,你有一个反例);如果使用不同的数据输入,扭曲中的线程会比其他线程先完成吗?我的观点是:如果没有分支,就不能输入不同的内容(即(1)中的假设是错误的)。在分支的情况下,每个路径都具有相同的长度并被序列化。所以线程无论如何都是在同一时间完成的。每个线程执行N个操作,其中N等于线程的全局ID。这是否足够,因为每个线程都有自己的数据?我可能在概念上对某些事情感到困惑;如果我错了,请纠正我。“执行N个操作”是一个循环。非无限循环包含停止条件(
    i
    )。条件是分支。指南是指O(1)(至少在理论上)的具体机器指令。O(n)操作由机器指令组成。为了使扭曲中的线程在其他线程之前完成,您需要为它们提供不同的数据。这只有在分支上才可能(除非我在这里错了,你有一个反例);将