【问题标题】:CUDA gridDim, blockDim are always user defined?CUDA gridDim,blockDim 总是用户定义的?
【发布时间】:2012-09-26 07:08:35
【问题描述】:

当我在内核调用时传递网格大小和线程数时,这些值是否会始终完全按照我传递的方式放置在 gridDim 和 blockDim 中?

此外,blockIdx 和 threadIdx 会始终遵守这些限制吗?

换句话说,调用

kernel<<<5, 7>>>()

总是导致在内核中,

gridDim.x == 5 && blockIdx.x < gridDim.x
blockDim.x == 7 && threadIdx.x < blockDim.x

以上条件成立? (同样具有 2D 和 3D 尺寸和索引?)

我知道这个问题听起来可能很愚蠢,但我想知道是否允许 CUDA 忽略资源分配的限制,因此程序员总是需要检查。

希望清楚,谢谢!

【问题讨论】:

    标签: c++ c cuda


    【解决方案1】:

    是的,如果您在维度 >> 中启动内核,它将有 5 个块和每个块 7 个线程。 请注意,如果您在 GPU 的范围内操作,您的效率最高。您应该使用从设备属性中读取的 warpsize 来获得卡的最大速度。根据需要使用大量线程,但块应该是您的 warpsize 的倍数。

    CUDA 本身不会将您的线程/块更改为其他大小,因此您应该可以处理寻址。

    【讨论】:

    • 感谢您的性能提示。请问您有参考答案吗?
    • 补充一点,如果由于任何原因驱动程序不能满足您的要求(例如,您要求 10K 线程/块这是不可能的,参见 CUDA C 编程指南),那么内核启动将失败,下一次 API 调用将返回错误。
    • 我使用的参考资料是 CUDA 编程指南,以及我在这方面遇到的其他 SO 问题。不过,我没有直接参考这个问题。
    猜你喜欢
    • 2013-05-13
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多