【发布时间】:2014-12-06 15:58:22
【问题描述】:
我是 sse 内在函数的新手,希望在使用这个 9 时提供一些提示帮助,因为这对我来说还很模糊)
我得到了这样的代码
for(int k=0; k<=n-4; k+=4)
{
int xc0 = 512 + ((idx + k*iddx)>>6);
int yc0 = 512 + ((idy + k*iddy)>>6);
int xc1 = 512 + ((idx + (k+1)*iddx)>>6);
int yc1 = 512 + ((idy + (k+1)*iddy)>>6);
int xc2 = 512 + ((idx + (k+2)*iddx)>>6);
int yc2 = 512 + ((idy + (k+2)*iddy)>>6);
int xc3 = 512 + ((idx + (k+3)*iddx)>>6);
int yc3 = 512 + ((idy + (k+3)*iddy)>>6);
unsigned color0 = working_buffer[yc0*working_buffer_size_x + xc0];
unsigned color1 = working_buffer[yc1*working_buffer_size_x + xc1];
unsigned color2 = working_buffer[yc2*working_buffer_size_x + xc2];
unsigned color3 = working_buffer[yc3*working_buffer_size_x + xc3];
int adr = base_adr + k;
frame_bitmap[adr] = color0;
frame_bitmap[adr+1]= color1;
frame_bitmap[adr+2]= color2;
frame_bitmap[adr+3]= color3;
}
这里的所有内容都是 int/unsigned,这是循环的关键部分,不确定整数 sse 是否有助于提高速度,但想知道它是否可以工作?有人可以帮忙吗?
(我使用mingw32)
【问题讨论】:
-
您能否对
working_buffer的实际访问模式进行去混淆处理?所以,简单的索引数学。这有点难以解码。我仍然不确定这是“奇怪的聚集”还是可以实际使用的模式。 -
看起来像“收集”类型的操作,所以你至少需要 AVX2。
-
working_buffer 是一个无符号颜色的纹理[][] - 数据有 1024 x 1024 虽然可悲的是 working_buffer 低维比 1024 大一点 - 虽然如果非常需要我可以重写一些代码来实现它只是未签名的 texture_bitmap[1024][1024]
-
xc yc 是纹理中的索引(应仅在 0 到 1023 、 0 到 1023 的纹理区域上运行)这是展开循环,因为展开它即使在标量代码中也可以使其更快;我不希望 sse 有明显的加速,但想习惯如何做这些事情,这对我来说很模糊(尤其是整数 intrisinc)
-
模式本身是针对给定的像素 i, j,转换为纹理坐标,读取纹理颜色并分配给 frame_bitmap - 尽管整个算法由瓦片 (12x12) 划分,这是瓦片中的 x 线(n 现在是 12,这是一次 4 个像素)