在我自己做之前,有没有可用于4x4矩阵的OpenGL特定/兼容矩阵数学的Python库?基本上,我需要Android的android.opengl.Matrix类提供的功能集.
我是SIMD/SSE的新手,我正在尝试做一些简单的图像过滤(模糊).下面的代码使用水平方向上的简单[1 2 1]加权过滤8位灰度位图的每个像素.我一次创建16个像素的总和.
至少对我而言,这段代码看起来非常糟糕的是,其中有很多插入/提取,这不是很优雅,也可能减慢一切.在转移时是否有更好的方法将数据从一个reg包装到另一个reg?
buf是图像数据,16字节对齐.w/h是宽度和高度,16的倍数.
__m128i *p = (__m128i *) buf;
__m128i cur1, cur2, sum1, sum2, zeros, tmp1, tmp2, saved;
zeros = _mm_setzero_si128();
short shifted, last = 0, next;
// preload first row
cur1 = _mm_load_si128(p);
for (x = 1; x < (w * h) / 16; x++) {
// unpack
sum1 = sum2 = saved = cur1;
sum1 = _mm_unpacklo_epi8(sum1, zeros);
sum2 = _mm_unpackhi_epi8(sum2, zeros);
cur1 = tmp1 = sum1;
cur2 = tmp2 = sum2;
// "middle" pixel
sum1 …Run Code Online (Sandbox Code Playgroud) 许多SSE指令允许源操作数是16字节对齐的存储器地址.例如,各种(非)包装说明.PUNCKLBW有以下签名:
PUNPCKLBW xmm1,xmm2/m128
现在,对于内在函数来说,这似乎是不可能的.看起来必须使用_mm_load*intrinsics来读取内存中的任何内容.这是PUNPCKLBW的内在特征:
__m128i _mm_unpacklo_epi8(__ m128i a,__ m128i b);
(据我所知,__ m128i类型总是指XMM寄存器.)
现在,这是为什么?这是相当悲伤,因为我通过直接寻址内存看到了一些优化潜力......
simd ×2
sse ×2
assembly ×1
intrinsics ×1
matrix ×1
opengl ×1
optimization ×1
performance ×1
python ×1
x86 ×1