实际上oclMat对齐是什么意思?

时间:2014-08-11 09:33:27

标签: c opencv opencl

OCL上阅读此链接:

  

7。 oclMat中的所有矩阵都在列中对齐(现在是对齐   步长因子是32+字节)。这意味着,m.cols * m.elemSize()   < = m.step

这里到底在说什么?这是否意味着插入额外的列以访问ROI像素?这里的对齐因素究竟是什么?

另外,我想看看oclMat的细节。

1 个答案:

答案 0 :(得分:1)

基本上,这意味着在每行之后插入一些“垃圾”字节,使得下一行的起始地址适合某些对齐。

例如,假设您有一个16位整数的矩阵,其宽度为12列(行数并不重要)。如果每行直接跟在下一行之后,则内存布局可能如下所示(假设元素从地址0x100000开始):

0x100000 <elem 0,0> <elem 0,1> <elem 0,2> ... <elem 0,11>
0x100018 <elem 1,0> <elem 1,1> <elem 1,2> ... <elem 1,11>
...

这里,每行是12(列数)x 2(每列/每个元素的字节数)= 24字节。但是,某些体系结构可能并不“喜欢”这样,因为每行只保证以8字节对齐,即SSE / AVX必须使用未对齐的访问,这要慢得多。

但是,如果我们“插入”8个额外的“垃圾”字节,则布局如下所示:

0x100000 <elem 0,0> <elem 0,1> ... <elem 0,11> <8 junk bytes>
0x100020 <elem 1,0> <elem 1,1> ... <elem 1,11> <8 junk bytes>
...

现在,每行为12(列数)x 2(每列字节数)+ 8(垃圾字节)= 32字节。现在,每行将对齐32个字节,这意味着它符合对齐AVX访问的256位对齐要求,这可以显着加快代码。