问题:我必须为每个联网客户端提供唯一ID,例如:
一点点解释和一些背景故事:
这个问题基本上是古老的问题,也触及了软件拷贝保护的主题,因为这里提到了该领域中使用的一些机制.在这一点上我应该清楚,我不是在寻找一种复制保护方案.请继续阅读.:)
我正在开发一个应该在本地网络中工作的客户端 - 服务器软件.我必须解决的一个问题是识别网络中的每个唯一客户端(而不是问题),以便我可以将某些属性应用于每个特定客户端,在特定部署的生命周期中保留并强制执行这些属性.客户.
在我寻找解决方案时,我发现了以下情况:
这种问题的明显选择是找出BIOS标识符(不过100%确定这是否通过相同的主板型号是唯一的),因为这是我唯一可以依赖的不重复,通过克隆传输,并且不能改变(至少不能通过使用一些用户空间程序).其他一切都失败了,因为要么不可靠(MAC克隆,任何人?),要么太苛刻(就其对配置变化过于敏感而言).
我想问的一个子问题是,我是否正确地进行了架构方面的工作?也许有一个更好的工具来完成我必须完成的任务......
我想到的另一种方法类似于握手机制,其中服务器维护一个连接的客户端ID的内部查找表(在任何给定时刻甚至可以完全基于软件和非唯一),并告诉客户端如果在连接时提供重复的ID,则在握手期间提供不同的ID.遗憾的是,这种方法不能很好地满足在生命周期内将属性绑定到特定客户端的要求之一.
我试着理解Congestion窗口和Receive窗口之间的区别.
据我所知,接收器窗口是接收器可以获取数据包的缓冲区.与拥塞窗口相同,它告诉我们接收器能力的界限,并根据丢失的数据包等进行更改.
那么它们之间的差异是什么?
我正在编写需要快速乘以大数的数学代码.它分解为整数数组与单个整数的乘法.在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) 我还在研究C++中任意长整数的例程.到目前为止,我已经为64位Intel CPU实现了加/减和乘法.
一切正常,但我想知道我是否可以通过使用SSE来加快速度.我浏览了SSE文档和处理器指令列表,但我找不到任何我认为可以使用的内容,原因如下:
SSE有一些整数指令,但大多数指令处理浮点.看起来它不是设计用于整数(例如,是否有较小的整数比较?)
SSE的想法是SIMD(相同的指令,多个数据),因此它提供了2或4个独立操作的指令.另一方面,我希望有一个像128位整数加(128位输入和输出)的东西.这似乎不存在.(但是?在AVX2中可能?)
整数加法和减法既不处理输入也不处理输出.因此,手动操作非常麻烦(因而也很慢).
我的问题是:我的评估是正确的还是有什么我忽略的?长整数例程可以从SSE中受益吗?特别是,它们可以帮助我编写更快的添加,子或mul例程吗?
我想知道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)
我在这里错过了什么吗?
当我正在进行快速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字节输出.
我的问题是:为什么AVX方法比SSE2方法慢(虽然不是很多)?我预计它至少会与之相提并论.使用YMM寄存器会花费多少额外的时间吗?内存已对齐(否则会获得GPF).
有没有人对此有解释?
我正在尝试拟合一些数据和东西,我知道有一个简单的命令用python/numpy/matplotlib做这个,但我找不到它.我觉得它有点像
popt,popc = numpy.curvefit(f,x)
Run Code Online (Sandbox Code Playgroud)
其中popt是的paramters f,popc是配合质量和f为f的预定义的函数.你们有谁知道吗?
我正在研究很长整数的乘法运算(大约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寄存器,所以速度要快得多.
一些问题:
ADD r11, 8改用.我非常感谢任何评论.
我想知道在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内在函数.
阻塞和非阻塞Winsock TCP套接字通常存在速度或性能差异吗?我可以得到两个套接字的差异,但两种类型之间没有详细的性能比较.
assembly ×3
bignum ×3
optimization ×2
performance ×2
python ×2
sse ×2
tcp ×2
x86-64 ×2
128-bit ×1
avx ×1
bios ×1
gmp ×1
hardware-id ×1
integer ×1
intrinsics ×1
ip ×1
numpy ×1
sockets ×1
visual-c++ ×1
windows ×1
winsock ×1