根据英特尔®64和IA-32架构优化参考手册 B.4节("英特尔®微体系架构代码名称Sandy Bridge的性能调整技术"),B.4.5.2小节("协助"):
跨越两页的32字节AVX存储指令需要一个大约150个周期的辅助.
我正在使用YMM寄存器来复制小型固定大小的内存块,从32到128个字节,并且这些块在堆管理器中以16个字节对齐.该堆管理器之前使用过XMM寄存器movdqa
,我想将其"升级"为YMM,而不将对齐从16字节更改为32字节.所以我正在使用vmovdqu ymm0, ymmword ptr [rcx]
,vmovdqu ymmword ptr [rdx], ymm0
等等......
如果我正确理解了英特尔文档的页面大小,如果我在4K页面边界上进行32字节存储,那么我将获得150个周期的惩罚.
但由于这些块已经对齐了16个字节,因此我点击跨页面存储的可能性是16/4096 = 1/256.如果我们在统计上推断出,在每个32字节的存储上,我在Sandy Bridge上得到1/255*150(= 0.5859375)个周期惩罚.
这不是那么多,并且由于将对齐从16字节更改为32字节,因此检查对齐或内存浪费肯定比分支更便宜.
我有以下问题:
我的计算是否正确?
对齐AVX-256内存存储器是否值得为小型固定大小的内存复制例程(32-128字节)而烦恼,因为达到惩罚的可能性如此之低?
是否存在比Sandy Bridge更高的未对齐32字节存储损失的处理器 - 例如,AMD或其他英特尔微体系结构?
我对Delphi 10.2 Pascal编程语言中的特定编程问题有疑问.
StringOfChar和FillChar在2012年之前发布的CPU上的Win64 Release版本下无法正常工作.
FillChar的预期结果只是在给定的内存缓冲区中重复8位字符的简单序列.
StringOfChar的预期结果是相同的,但结果存储在字符串类型中.
但实际上,当我在10.2版本的Delphi中编译我们在10.2之前的Delphi中运行的应用程序时,我们为Win64编译的应用程序在2012年之前发布的CPU上停止正常工作.
StringOfChar和FillChar不能正常工作 - 它们返回一串不同的字符,虽然是重复的模式 - 而不仅仅是它们应该具有相同字符的序列.
这是足以证明问题的最小代码.请注意,序列的长度应至少为16个字符,并且字符不应为nul(#0).代码如下:
procedure TestStringOfChar;
var
a: AnsiString;
ac: AnsiChar;
begin
ac := #1;
a := StringOfChar(ac, 43);
if a <> #1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1 then
begin
raise Exception.Create('ANSI StringOfChar Failed!!');
end;
end;
Run Code Online (Sandbox Code Playgroud)
我知道StackOverflow上有很多Delphi程序员.你遇到同样的问题吗?如果是,您如何解决?解决办法是什么?顺便说一句,我已经联系了Delphi的开发人员,但到目前为止他们还没有确认也没有否认这个问题.我正在使用Embarcadero Delphi 10.2版本25.0.26309.314.
更新:
如果您的CPU是在2012年或之后生产的,则在调用StringOfChar之前还要包含以下行以重现该问题:
const
ERMSBBit = 1 shl 9; //$0200
begin
CPUIDTable[7].EBX := CPUIDTable[7].EBX and not ERMSBBit;
Run Code Online (Sandbox Code Playgroud)
至于2017年4月的RAD Studio 10.2工具链问题修补程序 - 尝试过它而没有它 - 它没有帮助.无论Hotfix如何,问题都存在.
我正在使用 pyre-checking 进行静态类型测试,我想忽略项目中的特定错误。
例如: 未定义的属性 [16]:模块google.protobuf.struct_pb2
没有属性_STRUCT
。
假设如果我想从我的项目中忽略这个错误,我该怎么做?
我使用 secp256k1 生成了密钥和证书,运行rke
版本 v1.2.8,并收到以下错误:
FATA[0000] Failed to read certificates from dir [/home/max/cluster_certs]: failed to read certificate [kube-apiserver-requestheader-ca.pem]: x509: unsupported elliptic curve
Run Code Online (Sandbox Code Playgroud)
kubectl version
:
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Run Code Online (Sandbox Code Playgroud)
我已经通过以下方式生成了根 CA 密钥和证书:
openssl ecparam -name secp256k1 -genkey -noout -out ca-pvt.pem -rand random.bin -writerand random.bin
openssl req -config .\openssl.cnf -x509 -sha256 -new -nodes -key ca-pvt.pem -days 10227 -out ca-cert.cer -rand random.bin -writerand random.bin
Run Code Online (Sandbox Code Playgroud)
然后我用它来签署由rke cert generate-csr
我的 Kubernetes Rancher生成的 CSR cluster.yml …
我编写了一个简单的MAPI提供程序DLL,它实现了以下功能:
MapiLogOn
MapiLogOff
MapiSendMail
MapiSendDocuments
MapiFindNext
MapiReadMail
MapiSaveMail
MapiDeleteMail
MapiFreeBuffer
MapiAddress
MapiDetails
MapiResolveName
Run Code Online (Sandbox Code Playgroud)
我在注册表中注册了我的DLL HKLM\SOFTWARE\Clients\Mail\
,可以通过"默认程序"选择它.
它完美地工作(但仅限ANSI字符)!
现在,我正在尝试为它添加Unicode支持.
我已经实现了MapiSendMailW并将其声明为DLL的"导出"部分,因此MAPI DLL存根可以看到它导出MapiSendMailW,因此是Unicode.
但是,永远不会调用我的DLL的Unicode MapiSendMailW函数.而是调用ANSI版本MapiSendMail.
当我使用调用MAPI的应用程序时,例如Microsoft Internet Explorer(通过电子邮件发送链接)或Adobe Reader(通过电子邮件发送文件),国家字符来到我的MapiSendMail中的DLL替换为问号.如果我将默认邮件客户端切换到Outlook,Microsoft Internet Explorer将正确发送国家字符.
同时,Outlook将其MAPI DLL称为Unicode.我在下面找到了这个注册表值"SupportUTF8"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Clients\Mail\Microsoft Outlook
当我删除此注册表项时,当我通过电子邮件选择文件/发送/链接时,Microsoft Internet Explorer也开始在调用Outlook时将国家字符替换为问号.
所以,似乎"SupportUTF8"下 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun.....
有意义.
我的客户是在 HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\.....
将SupportUTF8添加到我的客户端是没有意义的(仍然是问号,没有MapiSendMailW从MSIE调用MapiSendMail(文件|发送|链接通过电子邮件).甚至添加SupportUTF8 HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Microsoft Outlook
没有使MSIE在调用Outlook时不会将国家字符替换为问号
无论SupportUTF8注册表值如何,当从MS Word调用我的客户端时,它获取MapiSendMail,但在ulReserved中它获取UTF8代码页编号,因此我的客户端能够显示国家字符.但它不会发生在MSIE(文件|发送|链接通过电子邮件),它总是用我的客户端替换国家字符到问号.
我应该将什么添加到我的DLL中,以便Windows Stub将其视为Unicode并调用MapiSendMailW?我应该向DLL注册实现其他函数,以向Stub显示它是Unicode吗?
我做了两个测试:
1)在Windows 10 64位上.MAPI DLL是32位.进程监视器(来自Sysinternals)显示MSIE运行一个进程fixmapi.exe,然后进行MAPI调用.
2)在Windows 7 32位上.没有使用fixmapi.exe:MSIE直接调用我的DLL,但仍然没有调用MapiSendMailW.
但是,我的测试MAPI应用程序使用MapiSendMailW调用我的DLL.
说,我想清除4个zmm寄存器.
以下代码是否会提供最快的速度?
vpxorq zmm0, zmm0, zmm0
vpxorq zmm1, zmm1, zmm1
vpxorq zmm2, zmm2, zmm2
vpxorq zmm3, zmm3, zmm3
Run Code Online (Sandbox Code Playgroud)
在AVX2上,如果我想清除ymm寄存器,vpxor比vxorps更快,速度更快,因为vpxor可以在多个单元上运行.
在AVX512上,我们没有用于zmm寄存器的vpxor,只有vpxorq和vpxord.这是清除寄存器的有效方法吗?当我使用vpxorq清除zmm寄存器时,CPU是否足够智能,不会对zmm寄存器的先前值产生错误依赖?
在没有物理AVX512 CPU测试的情况下 - 也许有人在Knights Landing上测试过?是否有任何延迟发布?
我将分支目标与NOP对齐,有时CPU执行这些NOP,最多15个NOP.Skylake可以在一个周期内执行多少个1字节NOP?其他与AMD兼容的处理器如何?我不仅对Skylake感兴趣,而且对其他微架构也感兴趣.执行一系列15个NOP可能需要多少个周期?我想知道增加这些NOP的额外代码大小和额外执行时间是否物有所值.这不是我添加这些NOP而是每当我编写align
指令时自动添加汇编程序的人.
更新:我已经设法自动插入多字节NOP
s.
如何在 Delphi 汇编器中协调短条件跳转与分支目标对齐?
\n\nI\xe2\x80\x99m 使用 Delphi 版本 10.2 Tokyo,针对 32 位和 64 位汇编,完全使用汇编编写一些函数。
\n\n如果我不\xe2\x80\x99t 使用 .align
,编译器会正确short
编码条件跳转指令(2 字节指令,由 1 字节操作码074h
和 1 字节相对偏移量 -+ 最多 07Fh 组成)。但是,如果我曾经放置过一个.align
,即使是小到.align 4
- 所有条件跳转指令都位于 .align 之前并且目标位于.align
- 在这种情况下,所有这些指令都变成 6 字节指令,而不是 2 字节指令他们应该是。只有位于 .align 之后的指令仍被正确编码为 2 字节short
。
Delphi 汇编器不接受 \xe2\x80\x99t 接受 \xe2\x80\x98short\xe2\x80\x99 前缀。
\n\n如何协调短条件跳转与分支目标对齐.align
在 Delphi 汇编器中协调短条件跳转与分支目标对齐?
这是一个示例程序 \xe2\x80\x93 请注意,有一个.align
这是一个示例程序 \xe2\x80\x93 请注意中间
procedure Test; assembler;\n label\n label1, …
Run Code Online (Sandbox Code Playgroud) 我在 Azure PowerShell 中创建了一个脚本。
如果我使用“echo”命令,它会将输出显示到控制台。
但是,如果我使用 Write-Output 和 Write-Error,我看不到输出。
我已将脚本“change-to-static.ps1”上传到存储帐户。然后我使用顶部栏上的按钮打开“Cloud Shell”。然后我在 PowerShell 控制台中输入“./change-ip-to-static.ps1”。
因此,除非我用“echo”或“print”替换“Write-Output”和“Write-Error”,否则脚本不会产生任何输出。
请帮我。我应该做什么才能看到输出?
脚本如下。
How to output Something in PowerShell有一个类似的问题。我已阅读它,但没有关于如何实现我的目标的具体示例,即如何修改我的脚本以查看输出。就我而言,即使我重定向到文本文件,它也不会输出。然而,在我的例子中,“echo”和“print”等命令可以工作,但上面的示例中没有涵盖它们。请参阅下面的脚本。
$IPs = Get-AzPublicIpAddress;
$Static = "Static";
foreach ($PublicIP in $IPs) {
$Method = $PublicIP.PublicIpAllocationMethod;
$Name = $PublicIP.Name;
if ($Method -eq $Static) {
$message = "The method of " + $Name + " is already " + $Static;
Write-Progress -Activity $message;
}
else {
Write-Progress -Activity "Changing the method of "+$Name+" from "+$Method+" to "+$Static+"...";
$PublicIP.PublicIpAllocationMethod = $Static; …
Run Code Online (Sandbox Code Playgroud) 每当我使用 RKE 设置 Rancher Kubernetes 集群时,该集群就会完美设置。但是,我收到以下警告消息:
WARN[0011] [reconcile] host [host.example.com] is a control plane node without reachable Kubernetes API endpoint in the cluster
WARN[0011] [reconcile] no control plane node with reachable Kubernetes API endpoint in the cluster found
Run Code Online (Sandbox Code Playgroud)
(在上面的消息中,host.example.com
是我实际主机名的占位符,此消息是针对 cluster.yml 中指定的每个控制平面主机给出的)
如何修改 RKEcluster.yml
文件或任何其他设置以避免此警告?
assembly ×4
avx ×2
delphi ×2
kubernetes ×2
rancher ×2
rancher-rke ×2
x86 ×2
x86-64 ×2
alignment ×1
avx2 ×1
avx512 ×1
azure ×1
azure-devops ×1
azureshell ×1
mapi ×1
memory ×1
nop ×1
optimization ×1
powershell ×1
pyre-check ×1
pysa ×1
python ×1
reconcile ×1
unicode ×1
windows ×1
xeon-phi ×1