在OCL上阅读此链接:
7。 oclMat中的所有矩阵都在列中对齐(现在是对齐 步长因子是32+字节)。这意味着,m.cols * m.elemSize() < = m.step
这里到底在说什么?这是否意味着插入额外的列以访问ROI像素?这里的对齐因素究竟是什么?
另外,我想看看oclMat的细节。
答案 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位对齐要求,这可以显着加快代码。