提问人:bjasku99 提问时间:9/13/2023 更新时间:9/13/2023 访问量:36
AVX512 使用的直方图制作
histogram making used by avx512
问:
我第一次尝试使用 avx512 指令并行实现直方图。 我的数据集是一个数组,其中包含从 0 到 255 的整数。(数组是对齐的),所以我的最终直方图数组包含 256 int,它应该表示每个亮度的像素数。 因此,为了实现并行解决方案,我制作了一个大 16 倍的数组(代码中的 16 = SIMD_WIDTH,这是 avx512 simd 寄存器中适合多少个 int32),以确保每个 simd 通道都对他自己的直方图区域进行内存事务处理,以避免内存冲突,这是代码运行良好。 当我尝试使用 avx512 将这些local_elements求和为最终直方图(在程序 local_hists 和 global_hist 中)时,问题就出现了。当我使用标量代码对它求和时,它运行良好。 所以这是我的 SIMD 代码:
for( int i = 0; i<SIMD_WIDTH; i++){
for( int j = 0; j < hist_size ; j+=SIMD_WIDTH){
_mm512_store_epi32( global_hist + j , _mm512_add_epi32( _mm512_load_epi32(global_hist + j) , _mm512_load_epi32(local_hists + (i*hist_size + j*SIMD_WIDTH)) ) );
}
}
这是我的标量代码:
for(int i = 0; i<SIMD_WIDTH; i++){
for(int j = 0; j < hist_size;j++){
global_hist[j]+=local_hists[i*hist_size + j];
}
}
hist_size = 256, SIMD_WIDTH = 16 ,所有数组都对齐 local_hists 数组是一个 16*256 长的 int 数组,前 256 个元素表示第一个 SIMD 通道直方图,接下来的 256 个元素表示第二个 SIMD 通道,依此类推。
我使用 gdb 来识别问题的位置,我发现,当我使用 SIMD 求和local_hists时会出现这种情况。 我尝试了一个标量代码,效果很好
答: 暂无答案
评论
long int
epi32
uint32_t
__m512i
global_hist[j] += stuff
global_hist
local_hists
__m512i sum
local_hists
realloc
std::vector::shrink_to_fit