小编cxx*_*xxl的帖子

可靠的方式生成唯一的硬件ID

问题:我必须为每个联网客户端提供唯一ID,例如:

  • 一旦客户端软件安装在目标计算机上,它(ID)应该保持不变,并且如果软件重新安装在同一台计算机和相同的操作系统上,则应继续保持,
  • 如果在大多数情况下修改硬件配置(更换主板除外),则不应更改
  • 当安装了客户端软件的硬盘驱动器克隆到具有相同硬件配置(或尽可能相似)的另一台计算机时,客户端软件应该知道该更改.

一点点解释和一些背景故事:

这个问题基本上是古老的问题,也触及了软件拷贝保护的主题,因为这里提到了该领域中使用的一些机制.在这一点上我应该清楚,我不是在寻找一种复制保护方案.请继续阅读.:)

我正在开发一个应该在本地网络中工作的客户端 - 服务器软件.我必须解决的一个问题是识别网络中的每个唯一客户端(而不是问题),以便我可以将某些属性应用于每个特定客户端,在特定部署的生命周期中保留并强制执行这些属性.客户.

在我寻找解决方案时,我发现了以下情况:

  • Windows激活系统使用某种对硬件修改极其敏感的重型指纹识别机制,
  • 磁盘映像软件会复制所有卷ID(格式化时绑定到每个分区),以及在安装过程中,首次运行期间或以任何其他方式自定义,唯一生成的ID,严格来说属于软件本身,并存储在注册表或在硬盘上,所以很容易混淆两个.

这种问题的明显选择是找出BIOS标识符(不过100%确定这是否通过相同的主板型号是唯一的),因为这是我唯一可以依赖的不重复,通过克隆传输,并且不能改变(至少不能通过使用一些用户空间程序).其他一切都失败了,因为要么不可靠(MAC克隆,任何人?),要么太苛刻(就其对配置变化过于敏感而言).

我想问的一个子问题是,我是否正确地进行了架构方面的工作?也许有一个更好的工具来完成我必须完成的任务......

我想到的另一种方法类似于握手机制,其中服务器维护一个连接的客户端ID的内部查找表(在任何给定时刻甚至可以完全基于软件和非唯一),并告诉客户端如果在连接时提供重复的ID,则在握手期间提供不同的ID.遗憾的是,这种方法不能很好地满足在生命周期内将属性绑定到特定客户端的要求之一.

windows client-server bios uniqueidentifier hardware-id

30
推荐指数
4
解决办法
4万
查看次数

TCP - 拥塞窗口和接收窗口之间的区别

我试着理解Congestion窗口和Receive窗口之间的区别.

据我所知,接收器窗口是接收器可以获取数据包的缓冲区.与拥塞窗口相同,它告诉我们接收器能力的界限,并根据丢失的数据包等进行更改.

那么它们之间的差异是什么?

ip tcp

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

优化x64汇编程序MUL循环

我正在编写需要快速乘以大数的数学代码.它分解为整数数组与单个整数的乘法.在C++中,这看起来像这样(在unsigned上):

void muladd(unsigned* r, const unsigned* a, unsigned len, unsigned b) {
   unsigned __int64 of = 0;  // overflow
   unsigned i = 0;  // loop variable
   while (i < len) {
      of += (unsigned __int64)a[i] * b + r[i];
      r[i] = (unsigned)of;
      of >>= 32;
      ++i;
   }
   r[i] = (unsigned)of;  // save overflow
}
Run Code Online (Sandbox Code Playgroud)

我手动展开了这个循环,将其转换为64位并处理.asm编译器输出以进一步优化它.主.asm循环现在看起来像这样:

mov   rax, rdi                             ; rdi = b
mul   QWORD PTR [rbx+r10*8-64]             ; rdx:rax = a[i] * b; r10 = i
mov   rsi, QWORD PTR [r14+r10*8-64] …
Run Code Online (Sandbox Code Playgroud)

optimization assembly x86-64 multiplication gmp

21
推荐指数
1
解决办法
2318
查看次数

长整数例程可以从SSE中受益吗?

我还在研究C++中任意长整数的例程.到目前为止,我已经为64位Intel CPU实现了加/减和乘法.

一切正常,但我想知道我是否可以通过使用SSE来加快速度.我浏览了SSE文档和处理器指令列表,但我找不到任何我认为可以使用的内容,原因如下:

  • SSE有一些整数指令,但大多数指令处理浮点.看起来它不是设计用于整数(例如,是否有较小的整数比较?)

  • SSE的想法是SIMD(相同的指令,多个数据),因此它提供了2或4个独立操作的指令.另一方面,我希望有一个像128位整数加(128位输入和输出)的东西.这似乎不存在.(但是?在AVX2中可能?)

  • 整数加法和减法既不处理输入也不处理输出.因此,手动操作非常麻烦(因而也很慢).

我的问题是:我的评估是正确的还是有什么我忽略的?长整数例程可以从SSE中受益吗?特别是,它们可以帮助我编写更快的添加,子或mul例程吗?

performance integer sse bignum arbitrary-precision

19
推荐指数
1
解决办法
3773
查看次数

Python中复数的格式

我想知道Python(3.3.0)打印复数的方式.我正在寻找解释,而不是改变印刷品的方法.

例:

>>> complex(1,1)-complex(1,1)
0j
Run Code Online (Sandbox Code Playgroud)

为什么不打印"0"?我的猜测是:保持类型复杂的输出.

下一个例子:

>>> complex(0,1)*-1
(-0-1j)
Run Code Online (Sandbox Code Playgroud)

好吧,一个简单的"-1j"或"( - 1j)"就可以了.为什么"-0"?? 和+0不一样吗?它似乎不是一个舍入问题:

>>> (complex(0,1)*-1).real == 0.0
True
Run Code Online (Sandbox Code Playgroud)

当假想部分变为正数时,-0消失:

>>> complex(0,1)
1j
>>> complex(0,1)*-1
(-0-1j)
>>> complex(0,1)*-1*-1
1j
Run Code Online (Sandbox Code Playgroud)

又一个例子:

>>> complex(0,1)*complex(0,1)*-1
(1-0j)
>>> complex(0,1)*complex(0,1)*-1*-1
(-1+0j)
>>> (complex(0,1)*complex(0,1)*-1).imag
-0.0
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

python complex-numbers

19
推荐指数
1
解决办法
1万
查看次数

AVX VMOVDQA比两个SSE MOVDQA慢?

当我正在进行快速ADD循环(加速x64汇编器ADD循环)时,我正在使用SSE和AVX指令测试内存访问.要添加,我必须读取两个输入并产生一个输出.所以我编写了一个虚拟例程,它将两个x64值读入寄存器,然后将其写回存储器而不进行任何操作.这当然没用,我只做了基准测试.

我使用一个展开的循环,每个循环处理64个字节.它由8个块组成,如下所示:

mov rax, QWORD PTR [rdx+r11*8-64]
mov r10, QWORD PTR [r8+r11*8-64]
mov QWORD PTR [rcx+r11*8-64], rax
Run Code Online (Sandbox Code Playgroud)

然后我将其升级到SSE2.现在我使用4个这样的块:

movdqa xmm0, XMMWORD PTR [rdx+r11*8-64]
movdqa xmm1, XMMWORD PTR [r8+r11*8-64]
movdqa XMMWORD PTR [rcx+r11*8-64], xmm0
Run Code Online (Sandbox Code Playgroud)

后来我使用了AVX(每个寄存器256位).我有2个这样的块:

vmovdqa ymm0, YMMWORD PTR [rdx+r11*8-64]
vmovdqa ymm1, YMMWORD PTR [r8+r11*8-64]
vmovdqa YMMWORD PTR [rcx+r11*8-64], ymm0
Run Code Online (Sandbox Code Playgroud)

到目前为止,还不那么引人注目.有趣的是基准测试的结果:当我在1K + 1K = 1K 64位字(即两次输入的8 kb和一次输出的8KB)运行三种不同的方法,我得到了奇怪的结果.以下每个时序用于处理两次64字节输入到64字节输出.

  • x64寄存器方法以大约15个周期/ 64个字节运行
  • SSE2方法以大约8.5个周期/ 64个字节运行
  • AVX方法以大约9个周期/ 64个字节运行

我的问题是:为什么AVX方法比SSE2方法慢(虽然不是很多)?我预计它至少会与之相提并论.使用YMM寄存器会花费多少额外的时间吗?内存已对齐(否则会获得GPF).

有没有人对此有解释?

assembly sse bignum avx arbitrary-precision

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

曲线拟合与python

我正在尝试拟合一些数据和东西,我知道有一个简单的命令用python/numpy/matplotlib做这个,但我找不到它.我觉得它有点像

popt,popc = numpy.curvefit(f,x)
Run Code Online (Sandbox Code Playgroud)

其中popt是的paramters f,popc是配合质量和f为f的预定义的函数.你们有谁知道吗?

python numpy curve-fitting

14
推荐指数
1
解决办法
4万
查看次数

加速x64汇编器ADD循环

我正在研究很长整数的乘法运算(大约100,000个十进制数字).作为我的图书馆的一部分,我要添加两个长数字.

分析表明我的代码在add()和sub()例程中运行的时间高达25%,因此尽可能快地运行它们非常重要.但我还没有看到太大的潜力.也许你可以给我一些帮助,建议,见解或想法.我会测试它们然后再回复你.

到目前为止,我的添加例程进行了一些设置,然后使用了8次展开的循环:

mov rax, QWORD PTR [rdx+r11*8-64]
mov r10, QWORD PTR [r8+r11*8-64]
adc rax, r10
mov QWORD PTR [rcx+r11*8-64], rax
Run Code Online (Sandbox Code Playgroud)

然后是7个具有不同偏移的块然后循环.

我之前尝试从内存中加载值,但这没有帮助.我想那是因为好的预取.我使用Intel i7-3770 Ivy Bridge 4核CPU.但我想编写适用于任何现代CPU的代码.

编辑:我做了一些时间:它在大约2.25个周期/单词中增加1k个单词.如果我移除ADC,那么只剩下MOV,它仍然需要大约1.95个周期/字.所以主要的瓶颈似乎是内存访问.一个库memcpy()工作在大约0.65个周期/单词,但只有一个输入,而不是两个.我猜,因为它使用了SSE寄存器,所以速度要快得多.

一些问题:

  • 使用"加载,加载,添加,存储"结构或"加载,添加到内存"帮助是否有用?到目前为止,我的测试没有显示出任何优势.
  • 像往常一样,没有SSE(2,3,4)的预期帮助?
  • 寻址(缩放索引加基数加偏移)是否会严重影响?我可以ADD r11, 8改用.
  • 循环展开怎么样?我读到展开对Sandy Bridge架构很糟糕(Agner Fog http://www.agner.org/optimize/).它是首选还是避免?
  • (编辑)我可以使用SSE寄存器从存储器加载和存储更大块的字,并有效地与通用寄存器和SSE寄存器交换字吗?

我非常感谢任何评论.

optimization assembly x86-64 bignum arbitrary-precision

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

Visual C++中的128位内部分割

我想知道在Visual C++中是否真的没有128位除法内部函数?

有一个名为_umul128()的64x64 = 128位乘法内部函数,它很好地匹配MUL x64汇编程序指令.

当然,我假设也会有一个128/64 = 64位内部分区(对DIV指令进行建模),但令我惊讶的是,Visual C++和英特尔C++似乎都没有它,至少它没有在intrin.h中列出.

有人可以证实吗?我尝试grep'ing在编译器可执行文件中的函数名称,但首先找不到_umul128,所以我想我看错了.

更新:至少我现在在Visual C++ 2010的c1.dll中找到了模式"umul128"(没有前导下划线).所有其他内在函数都列在它周围,但不幸的是没有"udiv128"之类的东西:(所以它似乎他们真的"忘记"实施它.

澄清一下:我不只是在寻找128位数据类型,而是在C++中将128位标量int除以64位int的方法.无论是一个内在的功能本地 128位整数的支持会解决我的问题.

编辑:答案是否定的,Visual Studio 2010或2012中没有_udiv128内在函数.

integer-division intrinsics visual-c++ 128-bit

10
推荐指数
4
解决办法
5352
查看次数

阻塞与非阻塞winsock的速度/性能特征

阻塞和非阻塞Winsock TCP套接字通常存在速度或性能差异吗?我可以得到两个套接字的差异,但两种类型之间没有详细的性能比较.

sockets performance tcp winsock

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