1

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

#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?

4

1 回答 1

1

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

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

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

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

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

但,

__shared__ float BlockData[TILE_DIM][TILE_DIM];

按块分配,因此您在每个块中都有可用的整个块。

于 2013-11-01T05:32:00.027 回答