了解CUDA内核内存利用率

时间:2019-05-15 20:13:58

标签: memory cuda profiling

对于一个项目,出于性能原因,我正在将处理算法转换为GPU。我目前正在分析代码,看看在哪里可以进一步改进它以获取更多收益。我正在为此使用NVIDIA视觉分析器。我以一个特定的内核为例,因为我很难看到它真正在哪里出现瓶颈,或者我是否真的在最大限度地利用GPU(我对此表示怀疑)。

内核是在之前的一组操作之后完成的,现在我想引入一个延迟并对输入执行缩放。目前,使用此分析器大约需要0.065s的时间来执行具有32 * 163840输出尺寸的特定内核。

当查看NVIDIA Profilers的结果和建议时,它告诉我占用率很高。但是,大多数延迟来自“内存相关性”,这被描述为“无法进行加载/存储,因为所需的资源不可用或未充分利用,或者给定类型的请求过多。通过优化内存对齐和访问模式,可以潜在地减少数据请求停顿。

但是当我随后查看内存使用率时,带宽使用率被描述为“低”。让我觉得它没有充分利用内存带宽。鉴于我只需要每个数据点一次,所以我也无法使用共享内存。而且我对内存使用和优化的知识非常有限,并且很难找到可以应用于此示例内核的优质资源。

还考虑到以下事实:如果我将此内核与其他只有单个数据点执行的内核进行比较,则该内核运行速度更快,而数学操作却不那么困难。 因此,利用此概要分析结果,找出其未充分利用其潜力的最佳方法是什么?

我使用以下设置启动内核:

dim3 threadsPerBlocks(32,32);
dim3 numBlocks(ceil(rows / (threadsPerBlocks.x*1.0)),ceil(columns / (threadsPerBlocks.y*1.0)));
mykernel<<<numBlocks, threadsPerBlocks>>>(input_d, output_d ,delay, inputlength, rows, columns);

和内核:

   __global__ void mykernel(float *input, float *output, int delay, int inputlength, int rows, int columns){            
        const int row = blockIdx.x * blockDim.x + threadIdx.x;
        const int column = blockIdx.y * blockDim.y + threadIdx.y;
        if(row < rows && column < columns){
            output[row*columns + column] = input[row*inputlength + column + delay] / inputlength; 
        }
    }

0 个答案:

没有答案