小编pep*_*tck的帖子

使用SSE计算汉明距离到几个字符串

我有n(8位)字符串,所有字符串都具有相同的长度(比方说m),另一个字符串s长度相同.我需要计算汉明距离s到其他每个字符串的距离.在普通的C中,类似于:

unsigned char strings[n][m];
unsigned char s[m];
int distances[n];

for(i=0; i<n; i++) {
  int distances[i] = 0;
  for(j=0; j<m; j++) {
    if(strings[i][j] != s[j])
      distances[i]++;
  }
}
Run Code Online (Sandbox Code Playgroud)

我想使用带有gcc的SIMD指令来更有效地执行这样的计算.我已经读过PcmpIstrI在SSE 4.2中有用并且我的目标计算机支持该指令集,所以我更喜欢使用SSE 4.2的解决方案.

编辑:

我编写了以下函数来计算两个字符串之间的汉明距离:

static inline int popcnt128(__m128i n) {
  const __m128i n_hi = _mm_unpackhi_epi64(n, n);
  return _mm_popcnt_u64(_mm_cvtsi128_si64(n)) + _mm_popcnt_u64(_mm_cvtsi128_si64(n_hi));
}

int HammingDist(const unsigned char *p1, unsigned const char *p2, const int len) {
#define MODE (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_BIT_MASK | …
Run Code Online (Sandbox Code Playgroud)

c gcc sse simd hamming-distance

13
推荐指数
1
解决办法
1287
查看次数

数组数组作为可迭代对象的可迭代对象

让我们考虑以下定义,以将 Int 的嵌套 Iterable 结构中的所有元素相加:

def add(xss : Iterable[Iterable[Int]]) : Int = xss.map(_.sum).sum
Run Code Online (Sandbox Code Playgroud)

但是,计算以下表达式会产生类型错误:

   scala> add(Array(Array(1,2,3)))
   <console>:9: error: type mismatch;
   found   : Array[Array[Int]]
   required: Iterable[Iterable[Int]]
                add(Array(Array(1,2,3)))
                         ^
Run Code Online (Sandbox Code Playgroud)

该函数与其他可迭代对象(如列表)一起按预期工作。我怎样才能避免这个错误?这样做的理由是什么?猜测这与 Java 原生的数组有关,但不知道这种情况下的具体细节。

谢谢

arrays iterable scala

3
推荐指数
1
解决办法
2473
查看次数

标签 统计

arrays ×1

c ×1

gcc ×1

hamming-distance ×1

iterable ×1

scala ×1

simd ×1

sse ×1