在Cuda中使用最大共享内存

在Cuda中使用最大共享内存,cuda,Cuda,我无法在V100、Cuda 10.2上使用超过48K的共享内存 我打电话 cudaFuncSetAttribute(my_kernel, cudaFuncAttributePreferredSharedMemoryCarveout, cudaSharedmemCarveoutMaxShared); 在第一次启动我的_内核之前 我使用启动边界 以及my_内核中的动态共享内存: 内核的名称如下: dim3 blk(

我无法在V100、Cuda 10.2上使用超过48K的共享内存

我打电话

cudaFuncSetAttribute(my_kernel,
                     cudaFuncAttributePreferredSharedMemoryCarveout,
                     cudaSharedmemCarveoutMaxShared);
在第一次启动我的_内核之前

我使用启动边界 以及my_内核中的动态共享内存:

内核的名称如下:

dim3 blk(32, 24); // 768 threads as in launch_bounds.

my_kernel<<<grd, blk, 64 * 1024, my_stream>>>( ... );
内核调用后的cudaGetLastError返回cudaErrorInvalidValue

如果我从以下位置使用:

Compute capability 7.x设备允许单线程块处理共享内存的全部容量:Volta上为96 KB,Turing上为64 KB。依赖于每个块超过48 KB的共享内存分配的内核是特定于体系结构的,因此它们必须使用动态共享内存,而不是静态大小的数组,并且需要使用cudaFuncSetAttribute显式选择加入,如下所示:

当我将该行添加到显示的代码中时,无效值错误消失。对于图灵设备,您需要将该数字从98304更改为65536。当然,对于你的例子来说,65536也足够了,尽管不足以使用volta上的最大可用容量,如问题标题中所述

在某种情况下,安培设备上的内核应该能够使用160KB的共享内存cc 8.0或100KB cc 8.6,动态分配,使用上述选择加入机制,例如cc 8.0的数字98304更改为163840,cc 8.6的数字为102400

请注意,以上内容涵盖了Volta 7.0图灵7.5和安培8.x的情况。在7.x之前具有计算能力的GPU不能处理每个线程块超过48KB的地址。在某些情况下,这些GPU在每个多处理器上可能有更多的共享内存,但这是为了在某些线程块配置中允许更大的占用。程序员无法使用每个线程块超过48KB的内存

虽然它不适用于这里介绍的已经使用动态共享内存分配的代码,但从摘录的文档引用中注意到,在支持它的设备上使用超过48KB的共享内存需要两件事:

上文已经描述的选择加入机制 内核代码中的动态而非静态共享内存。 动态模式示例:

extern __shared__ int shared_mem[];
静态的示例:

__shared__ int shared_mem[1024];
动态分配的共享内存还需要在内核启动配置参数中传递一个大小问题中给出了一个示例。

来源:

Compute capability 7.x设备允许单线程块处理共享内存的全部容量:Volta上为96 KB,Turing上为64 KB。依赖于每个块超过48 KB的共享内存分配的内核是特定于体系结构的,因此它们必须使用动态共享内存,而不是静态大小的数组,并且需要使用cudaFuncSetAttribute显式选择加入,如下所示:

当我将该行添加到显示的代码中时,无效值错误消失。对于图灵设备,您需要将该数字从98304更改为65536。当然,对于你的例子来说,65536也足够了,尽管不足以使用volta上的最大可用容量,如问题标题中所述

在某种情况下,安培设备上的内核应该能够使用160KB的共享内存cc 8.0或100KB cc 8.6,动态分配,使用上述选择加入机制,例如cc 8.0的数字98304更改为163840,cc 8.6的数字为102400

请注意,以上内容涵盖了Volta 7.0图灵7.5和安培8.x的情况。在7.x之前具有计算能力的GPU不能处理每个线程块超过48KB的地址。在某些情况下,这些GPU在每个多处理器上可能有更多的共享内存,但这是为了在某些线程块配置中允许更大的占用。程序员无法使用每个线程块超过48KB的内存

虽然它不适用于这里介绍的已经使用动态共享内存分配的代码,但从摘录的文档引用中注意到,在支持它的设备上使用超过48KB的共享内存需要两件事:

上文已经描述的选择加入机制 内核代码中的动态而非静态共享内存。 动态模式示例:

extern __shared__ int shared_mem[];
静态的示例:

__shared__ int shared_mem[1024];
动态分配的共享内存还需要在内核启动配置参数中传递一个大小问题中给出了一个示例