小编Max*_*tin的帖子

对齐AVX-256内存存储是否值得打扰?

根据英特尔®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字节,因此检查对齐或内存浪费肯定比分支更便宜.

我有以下问题:

  1. 我的计算是否正确?

  2. 对齐AVX-256内存存储器是否值得为小型固定大小的内存复制例程(32-128字节)而烦恼,因为达到惩罚的可能性如此之低?

  3. 是否存在比Sandy Bridge更高的未对齐32字节存储损失的处理器 - 例如,AMD或其他英特尔微体系结构?

memory assembly x86-64 avx avx2

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

用于Win64 Release Target的Delphi 10.2下的FillChar和StringOfChar

我对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如何,问题都存在.

windows delphi x86-64

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

如何忽略整个项目的pyre-check python包中的特定错误

我正在使用 pyre-checking 进行静态类型测试,我想忽略项目中的特定错误。

例如: 未定义的属性 [16]:模块google.protobuf.struct_pb2没有属性_STRUCT

假设如果我想从我的项目中忽略这个错误,我该怎么做?

python pyre-check pysa

13
推荐指数
2
解决办法
1027
查看次数

Kubernetes 证书支持哪些椭圆曲线?

问题

我使用 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 …

elliptic-curve kubernetes rancher rancher-rke

9
推荐指数
1
解决办法
4043
查看次数

如何声明我的简单MAPI提供程序DLL是Unicode并支持MapiSendMailW?

我编写了一个简单的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.

unicode mapi

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

在Knights Landing上清除单个或几个ZMM寄存器的最有效方法是什么?

说,我想清除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上测试过?是否有任何延迟发布?

assembly avx xeon-phi avx512 knights-landing

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

Skylake可以在一个周期执行多少个1字节NOP

我将分支目标与NOP对齐,有时CPU执行这些NOP,最多15个NOP.Skylake可以在一个周期内执行多少个1字节NOP?其他与AMD兼容的处理器如何?我不仅对Skylake感兴趣,而且对其他微架构也感兴趣.执行一系列15个NOP可能需要多少个周期?我想知道增加这些NOP的额外代码大小和额外执行时间是否物有所值.这不是我添加这些NOP而是每当我编写align指令时自动添加汇编程序的人.

更新:我已经设法自动插入多字节NOPs.

optimization x86 assembly alignment nop

6
推荐指数
2
解决办法
531
查看次数

如何在 Delphi 汇编器中使用“.align”来协调短条件跳转和分支目标对齐?

如何在 Delphi 汇编器中协调短条件跳转与分支目标对齐?

\n\n

I\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

\n\n

Delphi 汇编器不接受 \xe2\x80\x99t 接受 \xe2\x80\x98short\xe2\x80\x99 前缀。

\n\n

如何协调短条件跳转与分支目标对齐.align在 Delphi 汇编器中协调短条件跳转与分支目标对齐?

\n\n

这是一个示例程序 \xe2\x80\x93 请注意,有一个.align这是一个示例程序 \xe2\x80\x93 请注意中间

\n\n
    procedure Test; assembler;\n    label\n      label1, …
Run Code Online (Sandbox Code Playgroud)

delphi x86 assembly memory-alignment

6
推荐指数
1
解决办法
486
查看次数

Azure Powershell 输出未显示在控制台中

我在 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)

powershell azure azure-powershell azure-devops azureshell

5
推荐指数
1
解决办法
4605
查看次数

如何避免 Rancher RKE Reconcile 警告?

每当我使用 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文件或任何其他设置以避免此警告?

kubernetes rancher reconcile rancher-rke

5
推荐指数
1
解决办法
4755
查看次数