有关padding和pitch

本文深入探讨了CUDA中Padding和Pitch的概念与作用,详细解释了Padding如何通过填充确保二维数组对齐,以及Pitch如何作为二维数组的领先维度来优化内存访问效率。文章还介绍了与Pitch相关的CUDA API,并通过实例说明了Padding的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#有关padding和pitch
首先解释Padding和Pitch
##Padding:
即填充,在cuda程序中,其用在两个地方

  1. 对二维数组的逻辑行进行填充
  2. 为防止shared memory的冲突而填充shared memory

本篇只介绍第一中用法。
##Pitch(间距):
对于二维数组,c/c++使用行主导的方式,即行控制数组的访问
(如:baseAddress + N×row+col)
Pitch在这里就可以是:the leading dimension of an array A(called Ida)

##为什么要Padding
主要针对二维数组的对齐

为什么使用二维内存:
在CUDA中,二维内存在物理上也是以一维形式存储的,所以二维数组其实是逻辑上的二维数组,因为有些操作(如图片操作)与二维逻辑有关,如卷积。所以使用二维数组。

在逻辑中二维内存的访问中,为保证对齐对内存访问的对齐,我们必须保证我们的leading dimension是内存事物数(如32字节,L1:128字节)的整倍数。这样我们的内存操作就会是对齐的(这在处理跟图像行相关的问题时很有效),如31×31的二维数组,我们将其padding(填充)为32×31的二维数组(32就是pitch),定义一个add操作,第一行+1,第二行+2。。。第n行+n
如果padding后,每一行都对齐访问,内存效率是100%,但如果不处理,那么第一行是0~31,只处理0~30,而在处理第二行的时候,需要第一行剩下的那个元素,此时还需要多一个内存事物去取剩下的那一个元素,这会导致内存效率不是100%。

##pitch相关的CUDA API

申请二维内存:
cudaMallocPitch((void**)&devPtr, size_t* &pitch, size_t width*sizeof(type), size_t height);
在主机和设备之间copy二维内存:
cudaMemcpy2D(void * dst, size_t dpitch, const void * src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind)

##补充
内存事物的大小跟设备和起步启用一级缓存有关,而内存效率和内存事物大小和每个warp(线程束)合并的内存请求的大小和分布有关。内存效率 =
每个warp请求的内存量/实际的内存事物数×内存事物的大小

##实例
关于padding的实验及其相关内容,在下一篇实验

<template> <div class="container"> <el-input v-model="text" type="textarea" :rows="5" placeholder="输入要转换的文本" /> <el-select v-model="selectedVoice" placeholder="选择发音人" class="mt-20" > <el-option v-for="voice in voices" :key="voice.name" :label="voice.name" :value="voice" /> </el-select> <div class="sliders mt-20"> <div class="slider-item"> <span>语速 ({{ rate }}x)</span> <el-slider v-model="rate" :min="0.5" :max="2" :step="0.1"/> </div> <div class="slider-item"> <span>音调 ({{ pitch }})</span> <el-slider v-model="pitch" :min="0" :max="2" :step="0.1"/> </div> <div class="slider-item"> <span>音量 ({{ volume }})</span> <el-slider v-model="volume" :min="0" :max="1" :step="0.1"/> </div> </div> <el-button type="primary" class="mt-20" @click="generateSpeech" > 生成语音 </el-button> </div> </template> <script setup> import { ref, reactive, onMounted } from 'vue' const text = ref('') const selectedVoice = ref(null) const rate = ref(1) const pitch = ref(1) const volume = ref(1) const voices = ref([]) onMounted(() => { // 加载可用语音列表 speechSynthesis.addEventListener('voiceschanged', () => { voices.value = speechSynthesis.getVoices() }) }) const generateSpeech = () => { if (!text.value) return const utterance = new SpeechSynthesisUtterance(text.value) utterance.voice = selectedVoice.value utterance.rate = rate.value utterance.pitch = pitch.value utterance.volume = volume.value speechSynthesis.speak(utterance) } </script> <style scoped> .container { max-width: 800px; margin: 20px auto; padding: 20px; } .mt-20 { margin-top: 20px; } .slider-item { margin: 15px 0; } </style>生成语言按钮放在文本输入框的右下角,并且是一个三角播放按钮
最新发布
03-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值