小编Ser*_*tch的帖子

查找具有相似文本的文章的算法

我在数据库中有很多文章(标题,文字),我正在寻找一种算法来找到X最相似的文章,比如Stack Overflow的"相关问题",当你提出问题时.

我尝试谷歌搜索,但只找到关于其他"类似文本"问题的页面,比如将每篇文章与所有其他文章进行比较并在某处存储相似性.因此,我只是在我刚输入的文本上"实时"执行此操作.

怎么样?

language-agnostic string algorithm text similarity

60
推荐指数
3
解决办法
3万
查看次数

程序可以同时在同一个FILE*上调用fflush()吗?

如果多个线程同时调用fflush()同一个FILE*变量,是否会发生任何不良事件(如未定义的行为,文件损坏等)?

澄清:我不是指同时写文件.我只是说要同时冲洗它.

线程不会同时读取或写入文件(它们只在临界区内写入文件,一次一个线程).它们只在临界区外冲洗,以便更快地释放关键部分,以便让其他人完成其他工作(文件写入除外).

虽然可能发生一个线程正在写文件(在临界区内),而另一个线程正在刷新文件(在临界区之外).

c multithreading file stdio fflush

43
推荐指数
3
解决办法
1784
查看次数

什么是_mm_prefetch()位置提示?

内部函数导说,只有这么多关于void _mm_prefetch (char const* p, int i):

从包含地址p的内存中获取数据行到由locality hint i指定的缓存层次结构中的位置.

你能列出int i参数的可能值并解释它们的含义吗?

我发现_MM_HINT_T0,_MM_HINT_T1,_MM_HINT_T2,_MM_HINT_NTA_MM_HINT_ENTA,但我不知道这是否是一个详尽的列表和它们的含义.

如果特定于处理器,我想知道他们在Ryzen和最新的英特尔酷睿处理器上做了什么.

c++ x86-64 prefetch intrinsics cpu-cache

15
推荐指数
1
解决办法
7077
查看次数

我可以在 Django 中的哪个位置运行需要模型的启动代码?

在 Django 启动时,我需要运行一些需要访问数据库的代码。我更喜欢通过模型来做到这一点。

这是我目前拥有的apps.py

from django.apps import AppConfig
from .models import KnowledgeBase

class Pqawv1Config(AppConfig):
    name = 'pqawV1'

    def ready(self):
        to_load = KnowledgeBase.objects.order_by('-timestamp').first()
        # Here should go the file loading code
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下异常:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

那么在模型初始化之后,Django 中有没有地方可以运行一些启动代码呢?

python database django startup django-models

11
推荐指数
1
解决办法
3231
查看次数

有效地交织比特

我需要做出uint64_t2个uint32_t交错的比特:如果A=a0a1a2...a31B=b0b1...b31,我需要C = a0b0a1b1...a31b31.有没有办法有效地做到这一点?到目前为止,我只有一个for循环的32次迭代的天真方法,每次迭代都有C|=((A&(1<<i))<<i)|((B&(1<<i))<<(i+1)).

我想应该有一些数学技巧,例如将A和B乘以一些特殊数字,这导致在得到的64位数字中将它们的位与零交错,这样只剩下or这些产品.但我找不到这样的乘数.

另一种可能的方法是编译器内部或汇编指令,但我不知道.

c++ algorithm math assembly bit-manipulation

10
推荐指数
2
解决办法
1532
查看次数

如何在 C++ 中声明/定义相互依赖的模板?

通常在 C++ 中,当我需要类之间的相互依赖性时,我在头文件中使用前向声明,然后在每个 cpp 文件中包含这两个头文件。

然而,当使用模板时,这种方法就会失效。因为模板必须完全位于头文件中(不包括当我将代码放入 cpp 并枚举template class A<T>;每个受支持的情况时的情况T- 这并不总是可行,例如何时T是 lambda)。

那么有没有办法在 C++ 中声明/定义相互依赖的模板呢?

代码示例

template<typename T> struct B;
template<typename T> struct A {
  void RunA(B<T> *pB) {
    // need to do something to B here
  }
};

template<typename T> struct B {
  void RunB(A<T> *pA) {
    // need to do something to A here
  }
};
Run Code Online (Sandbox Code Playgroud)

如果我开始对Bin做一些事情,我想,我会得到一个“缺少定义”错误,因为在编译RunA()时只有 B 的前向声明可用。RunA()

也许有一些技巧来组织头文件,例如将每个头拆分为类定义和方法定义文件,然后以某种奇特的方式包含它们。或者也许可以通过第三/第四类来完成某些事情。但我无法想象具体如何做到这一点。

C++11/14/17 都可以(具体来说,它是 MSVC++2017,工具集 v141)。

c++ templates compilation include c-preprocessor

10
推荐指数
1
解决办法
1173
查看次数

如何有效地并行设置位向量的位?

考虑其中的位向量N(N大)和M数字数组(M中等,通常小得多N),每个都在范围内0..N-1指示必须将向量的哪个位设置为1.后一个数组未排序.位向量只是一个整数数组,具体而言__m256i,每个__m256i结构中包含256位.

如何在多个线程中有效地分割这项工作?

首选语言是C++(MSVC++ 2017工具集v141),汇编也很棒.首选CPU是x86_64(内在函数没问题).如果有任何益处,AVX2是理想的.

c++ algorithm parallel-processing x86 bit-manipulation

10
推荐指数
1
解决办法
613
查看次数

4 uint16_t的快速模12算法打包在uint64_t中

考虑以下联合:

union Uint16Vect {
    uint16_t _comps[4];
    uint64_t _all;
};
Run Code Online (Sandbox Code Playgroud)

是否有快速算法来确定每个组件是否等于1模12?

一个天真的代码序列是:

Uint16Vect F(const Uint16Vect a) {
    Uint16Vect r;
    for (int8_t k = 0; k < 4; k++) {
        r._comps[k] = (a._comps[k] % 12 == 1) ? 1 : 0;
    }
    return r;
}
Run Code Online (Sandbox Code Playgroud)

c algorithm vectorization modulo avx2

9
推荐指数
2
解决办法
316
查看次数

将__m256i的前N位或后N位设置为1的有效方法,其余为0

如何1有效地设置AVX2

  1. 第一N
  2. 最后N

__m256i,其余的设置0

当范围可以在__m256i值的中间开始和结束时,这些是针对位范围的尾部和头部的2个单独的操作.占据全部__m256i值的范围部分使用全部0或全部1掩模进行处理.

c++ bit-manipulation x86-64 vectorization avx2

8
推荐指数
1
解决办法
734
查看次数

在AVX2中高效实现log2(__ m256d)

__m256d _mm256_log2_pd (__m256d a)除了英特尔之外,SVML 还没有其他编译器可用,他们表示其性能在AMD处理器上是有缺陷的.在g ++ - 4.8中缺少AVX日志内在函数(_mm256_log_ps)中的一些互联网实现SSE和AVX的SIMD数学库,但它们似乎比AVX2更多的SSE.还有Agner Fog的矢量库,但是它是一个包含更多东西的大型库,它只是向量log2,所以从它的实现中很难找出向量log2操作的基本部分.

那么有人可以解释如何有效地实现log2()4个double数字向量的操作吗?即就是__m256d _mm256_log2_pd (__m256d a)这样,但可用于其他编译器,并且AMD和Intel处理器的效率相当高.

编辑:在我目前的特定情况下,数字是介于0和1之间的概率,而对数用于熵计算:所有i的和的否定P[i]*log(P[i]).浮点指数的P[i]范围很大,因此数字可以接近0.我不确定准确度,因此会考虑以30位尾数开头的任何解决方案,尤其是可调整的解决方案.

EDIT2:这是我到目前为止的实现,基于https://en.wikipedia.org/wiki/Logarithm#Power_series的 "更有效的系列" .怎么改进?(需要提高性能和精度)

namespace {
  const __m256i gDoubleExpMask = _mm256_set1_epi64x(0x7ffULL << 52);
  const __m256i gDoubleExp0 = _mm256_set1_epi64x(1023ULL << 52);
  const __m256i gTo32bitExp = _mm256_set_epi32(0, 0, 0, 0, 6, 4, 2, 0);
  const __m128i gExpNormalizer = _mm_set1_epi32(1023);
  //TODO: some 128-bit variable or two 64-bit variables …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm floating-point logarithm avx2

7
推荐指数
2
解决办法
1636
查看次数