- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个 uint8_t
数组,它们都有 64 个元素。我想出的“最佳”方法是加载 4x 16 个元素,将它们放入两个 m128i
寄存器,然后将它们都放入一个 m256
寄存器。这是为两个 uint8_t
数组完成的,如下所示:
__m128i a1, a2, b1, b2, s1, s2;
__m256i u, v, c;
// 128 bit of data x 2
a1 = _mm_set_epi64(*(__m64*)block1, *((__m64*)(block1 + stride)));
block1 += stride + stride;
a2 = _mm_set_epi64(*(__m64*)block1, *((__m64*)(block1 + stride)));
// the upper 128 bits of the result are undefined
u = _mm256_castsi128_si256(a1);
// Copy a to dst, then insert 128 bits from b into dst at the location specified by imm.
u = _mm256_insertf128_si256(u, a2, 0x1);
b1 = _mm_set_epi64(*(__m64*)block2, *((__m64*)(block2 + stride)));
block2 += stride + stride;
b2 = _mm_set_epi64(*(__m64*)block2, *((__m64*)(block2 + stride)));
// the upper 128 bits of the result are undefined
v = _mm256_castsi128_si256(b1);
// Copy a to dst, then insert 128 bits from b into dst at the location specified by imm.
v = _mm256_insertf128_si256(v, b2, 0x1);
我现在有两个m256
寄存器,u
和v
,可以计算SAD:
c = _mm256_sad_epu8(u, v);
但是,可能是因为时间太晚,我无法想出更好的方法来获得结果......这是我现在得到的:
s1 = _mm256_extractf128_si256(c, 0x0);
s2 = _mm256_extractf128_si256(c, 0x1);
int p, q;
p = _mm_extract_epi32(s1, 0x0);
q = _mm_extract_epi32(s1, 0x2);
*result += p + q;
p = _mm_extract_epi32(s2, 0x0);
q = _mm_extract_epi32(s2, 0x2);
*result += p + q;
result
是一个 int,如果不清楚的话。
这会生成相当多的指令。在我看来,这是加载我想要的所有单位的唯一方法。但是,这可能不是从 m256i c
寄存器中获取结果的最佳方式。
你说呢? 你能帮助我以更优化的方式做到这一点吗?
放在一起,函数看起来像这样:
void foobar(uint8_t *block1, uint8_t *block2, int stride, int *result)
{
*result = 0;
int i;
__m128i a1, a2, b1, b2, s1, s2;
__m256i u, v, c;
for (i = 0; i < 2; ++i) {
// loading of uints
// calculating SAD, and getting result
block1 += stride; block2 += stride;
block1 += stride; block2 += stride;
}
}
由于 uint 组织方式的性质,我一次只能加载八个,然后我必须使用 stride
递增地址。一次加载 16 个,会产生不好的结果。
最佳答案
关于从两个字节数组中获取绝对差的总和,这是我使用 SSE 的方式:
__m128i sum1 = _mm_sad_epu8(u,v);
__m128i sum2 = _mm_shuffle_epi32(sum1,2);
__m128i sum3 = _mm_add_epi16(sum1,sum2);
int8_t sum4 = (int8_t)_mm_cvtsi128_si32(sum3);
我现在不能在 AVX2 上测试这个,但这是我会先尝试的未经测试的代码
__m256i sum1 = _mm256_sad_epu8(u,v);
__m256i sum2 = _mm256_shuffle_epi32(sum1,2);
__m256i sum3 = _mm256_add_epi16(sum1,sum2);
__m128i sum4 = _mm_add_epi16(_mm256_castsi256_si128(sum3),
_mm256_extracti128_si256(sum3,1));
int8_t sum5 = (int8_t)_mm_cvtsi128_si32(sum4);
我可以稍后再测试。
关于给定两个 uint8_t 数组,计算 128 个元素的 SAD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25676105/
为大家分享一组极度闷骚的讨红包表情,聊天发状态可以有!讨红包的主人公是一只嫉妒闷骚的绿皮青蛙,名为sad frog,希望大家会喜欢。 &
平安夜没人约,圣诞节没人约,今后的节日都没人约,反倒是得看情侣们在网上各种秀恩爱,人生如此艰难,为何要虐单身狗呢? &nb
我正在实现一个 JAVA 程序来查找不同图像帧之间的相似性。目前我正在使用两种不同的算法来实现这一目标。基本上我将图像划分为 n*n 像素 block 并计算 SAD为他们进行比较。现在我的主要问题是
我有文本文件: # How often update data period=30 #For Location location=London.uk 我想在标准输出上打印: London.uk 当我使
我正在尝试编写 16 个 uint8_t 大小输入的绝对差和的 NEON 版本: inline static int f_sad_16(const uint8_t* a, const uint8_t*
我对 ARM 和 NEON 编程相当陌生,我被赋予了优化 SAD(绝对差和)函数的任务。我不知道从哪里开始,我尝试了几种生成 NEON 代码的方法但没有成功。顺序函数看起来像这样: void sad_
所以我想用“HAPPY”替换所有快乐的表情符号,反之亦然用“SAD”替换文本文件的悲伤表情符号。但是代码无法正常工作。虽然它检测到笑脸(截至目前 :-)),但在下面的示例中它没有用文本替换表情符号,它
如果我们从 SAD 算法计算出视差值,我们如何使用该视差值来制作视差图?他们有什么方法吗? 最佳答案 当您使用 SAD 算法计算视差值时,您会得到每个像素的视差值。假设您有两张尺寸为 100x100(
我有两个 uint8_t 数组,它们都有 64 个元素。我想出的“最佳”方法是加载 4x 16 个元素,将它们放入两个 m128i 寄存器,然后将它们都放入一个 m256 寄存器。这是为两个 uint
网络应用在这里: http://www.digitaltransitions.com/visualizer/visualizer.html 主要的javascript在这里: http://www.d
我刚开始学习 Python 几天,所以请原谅我的粗暴工作。 def sum_digits(n): s = 0 while n: s += n % 10
我是一名优秀的程序员,十分优秀!