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

Cuda 共享变量并行工作的最大块数和线程数,cuda,gpu,shared-memory,Cuda,Gpu,Shared Memory,考虑将在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 } 如何确定单个多处理器上可以并行执行的最大块和线程数?另外,如果我

考虑将在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?

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

在SM(流式多处理器)上执行多少个块?每个SM在开普勒上最多可有16个活动块,在费米上最多可有8个活动块

你也需要从扭曲的角度来思考。一条经线=32条线。在费米中,活动扭曲的数量是48,而在开普勒中,它是每平方米64。这些是理想的数字。SM上执行的实际扭曲数取决于启动配置和内核中使用的资源数量

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

如果有N个块,则共享内存总量将除以N。如果要有大量块,则可能需要查看占用率计算器电子表格,以检查在不影响性能的情况下可以使用多少共享内存

但是,


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

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

在SM(流式多处理器)上执行多少个块?每个SM在开普勒上最多可有16个活动块,在费米上最多可有8个活动块

你也需要从扭曲的角度来思考。一条经线=32条线。在费米中,活动扭曲的数量是48,而在开普勒中,它是每平方米64。这些是理想的数字。SM上执行的实际扭曲数取决于启动配置和内核中使用的资源数量

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

如果有N个块,则共享内存总量将除以N。如果要有大量块,则可能需要查看占用率计算器电子表格,以检查在不影响性能的情况下可以使用多少共享内存

但是,


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

对于您的示例,由共享内存确定的理论占用率由每个块使用的共享内存总量除以可用的共享内存总量得出。这将提供可同时驻留在SM上的最大线程块数。每个SM的可用共享内存总量为48KB,假设您将缓存配置设置为这种方式(首选共享),并且一些少量的共享内存字节将在内核启动开销中用完。线程数将仅为每个块的线程数乘以块数。对于您的示例,由共享内存确定的理论占用率将由每个块使用的总共享内存除以可用的总共享内存得出。这将提供可同时驻留在SM上的最大线程块数。每个SM的可用共享内存总量为48KB,假设您将缓存配置设置为这种方式(首选共享),并且一些少量的共享内存字节将在内核启动开销中用完。线程数将仅为每个块的线程数乘以每个块的线程数。
__shared__ float BlockData[TILE_DIM][TILE_DIM];