早上好。
我开始学习cuda编程,我正在研究性能。我在CUDA的网站上看到,要想有好的表现,我们应该考虑以下四点:
-warps / SM (系统多处理器),-blocks / SM,-Register,SM,-Shared内存,SM
因此,我要回顾一下第一件事情,根据GPU,我定义了内核的尺寸,这取决于每个SM的最大偏差和每个SM的块。我的任务是用一亿美元来衡量哪种方法更好。
我所做的是一个for循环,在这个循环中,我在每次迭代时启动一个内核,使占用最大化。例如,对于NVidia 1080 GPU,我读到:
int max_blocks = 32; //maximum number of
我有一个CUDA程序,其中内核寄存器将最大理论达到的占用限制在%50。因此,我决定使用共享内存,而不是寄存器,这些变量是块线程之间的常量,并且在整个内核运行过程中几乎是只读的。我不能在这里提供源代码;我所做的在概念上是这样的:
我最初的计划是:
__global__ void GPU_Kernel (...) {
__shared__ int sharedData[N]; //N:maximum amount that doesn't limit maximum occupancy
int r_1 = A; //except for this first initial
刚开始学习CUDA,有些东西我还不太明白。我想知道,除了优化GPU工作负载之外,是否还有理由将线程分割成块。因为如果没有,我不明白为什么需要手动指定块的数量和大小。这样做不是更好吗?简单地提供解决任务所需的线程数,让GPU通过SMs分发线程不是更好吗?
也就是说,考虑下面的虚拟任务和GPU设置。
number of available SMs: 16
max number of blocks per SM: 8
max number of threads per block: 1024
假设我们需要处理256×256矩阵的每个条目,我们需要分配给每个条目的线程,即线程总数为256x256 =
我有下面的"Frankenstein“和减少代码,部分取自,部分来自数据自动化系统样本。
__global__ void reduce6(float *g_idata, float *g_odata, unsigned int n)
{
extern __shared__ float sdata[];
// perform first level of reduction,
// reading from global memory, writing to shared memory
unsigned int tid = threadIdx.
我正在使用nvprof来测量已实现的占用率,并将其确定为
已入伙0.344031 0.344031 0.344031
但是使用占用率计算器,我发现75%。
研究结果如下:
Active Threads per Multiprocessor 1536
Active Warps per Multiprocessor 48
Active Thread Blocks per Multiprocessor 6
Occupancy of each Multiprocessor 75%
我使用33个寄存器,144个字节共享内存,256个线程/块,设备功能3.5。
编辑:
另外,我想让cla
我运行了颤振运行-d linux,下面是错误
Launching lib/main.dart on Linux in debug mode... Building Linux application... [FATAL:flutter/shell/gpu/gpu_surface_gl_delegate.cc(50)] Check failed: gl_version_string. The GL proc resolver's glGetString(GL_VERSION) failed Error waiting for a debug connection: The log rea