根据英特尔®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指令时自动添加汇编程序的人.
更新:我已经设法自动插入多字节NOPs.
如何在 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