共享变量并行工作的最大块数和线程数

时间:2013-11-01 05:16:33

标签: cuda gpu shared-memory

考虑在K2000 GPU卡上执行的GPU内核功能(计算能力3.0)如下所示:

#define TILE_DIM 64
__global__ void PerformSomeOperations(float* g_A, float* g_B)
{
    __shared__ float BlockData[TILE_DIM][TILE_DIM];
    // Some Operation to be performed
}

如何确定可在单个多处理器上并行执行的最大块数和线程数?此外,如果我有N个块,这意味着每个块的共享内存将除以N?

1 个答案:

答案 0 :(得分:1)

您可以从示例中运行devicequery示例以确定最大块数。 HERE在每个块中,最多可以包含1024个线程。

在SM(流式多处理器)上执行了多少个块?每个SM 在Kepler上都有最多 16个活动块,在Fermi上有8个活动块。

你还需要考虑经线。一个warp = 32个线程。在Fermi中,活动扭曲的数量是48,而在开普勒,每个SM的数量是64。这些是理想的数字。在SM上执行的实际warp数取决于启动配置和您在内核中使用的资源数。

通常,您将计算占用率=活动扭曲数/最大活动扭曲数。

如果您有N个区块,那么总共享内存除以N.如果您想拥有大量的区块,那么您可能需要检查占用率计算器电子表格以检查多少您可以使用共享内存而不影响性能。

但是,

__shared__ float BlockData[TILE_DIM][TILE_DIM];
每个块分配

,因此您可以在每个块中使用整个块。