有一个循环:
long a* = new long[32];
long b* = new long[32];
double c* = new double[32];
double d = 3.14159268;
//set a, b and c arrays
//.....
for(int i = 0; i < 32; i ++){
d+= (a[i] % b[i])/c[i];
}
Run Code Online (Sandbox Code Playgroud)
我如何使用英特尔 C++ 矢量化功能(例如#pragma simd 或 sse- 指令)来实现此周期?
如果我写:
#pragma simd reduction(+:c)
for(int i = 0; i < 32; i ++){
d+= (a[i] % b[i])/c[i];
}
Run Code Online (Sandbox Code Playgroud)
那么速度不会增加:(
我使用GoogleColab来测试数据结构,如chain-hashmap、probe-hashmap、AVL-tree、red-black-tree、splay-tree(用Python编写),并且我用这些数据存储非常大的数据集(键值对)结构来测试一些操作的运行时间,它的规模就像一个小维基百科,所以运行这些Python脚本将使用非常多的内存(RAM),GoogleColab提供了大约12G RAM但对我来说不够,这些Python脚本将使用大约20- 30G RAM,所以当我在GoogleColab中运行python程序时,经常会出现“你的程序运行超过12G上限”的异常,并且经常重新启动。另一方面,我有一些PythonScript来做一些递归算法,如图所示总而言之,递归算法使用CPU vety mush(以及RAM),当我以20000+递归运行这些算法时,GoogleColab经常无法运行并重新启动,我知道GoogleColab使用两个核心的Intel-XEON CPU,但是怎么办我应用了更多 Google 的 CPU 核心吗?
当我尝试使用 AT&T Intel 语法汇编和运行 .s 文件时,收到奇怪的错误消息。不确定我是否一开始就使用了正确的架构,或者是否有语法错误,是否没有使用正确的命令来汇编和链接等。完全迷失了,我不知道从哪里开始。
基本上,我有一个名为 yea.s 的文件,其中包含一些简单的汇编指令。然后我尝试使用命令编译它as yea.s -o yea.o,然后链接使用ld yea.o -o yea. 运行 ld 时,我收到这个奇怪的消息:ld: warning: cannot find entry symbol _start; defaulting to 000000440000。
这是我试图运行的程序,非常简单,并且没有真正执行任何操作。
resMsg: .asciz "xxxxxxxx"
.text
.global main
main:
pushq $0
ret
Run Code Online (Sandbox Code Playgroud)
我只是不明白发生了什么事。显然,这是为了学校作业。显然,我不是在寻找作业的答案,但这是我可以实际开始编码的起点。我只是不知道如何简单地运行该程序,作业中没有说明这一点。不管怎样,先谢谢大家了!
我相信 Windows 已经在内部使用该指令很长时间了,所以 CPU 制造商会花精力去优化吗?
当然,假设适当对齐的内存和不共享缓存线等。
由于其 TSO 内存模型,X86 保证所有商店的总顺序。我的问题是是否有人知道这是如何实际实施的。
我对所有 4 个围栏是如何实现的印象很好,所以我可以解释如何保留本地秩序。但是 4 个栅栏只会给 PO;它不会给您 TSO(我知道 TSO 允许旧商店跳到新负载前面,因此只需要 4 个围栏中的 3 个)。
单个地址上所有内存操作的总顺序是一致性的责任。但我想知道英特尔(特别是 Skylake)如何在多个地址的商店上实现总订单。
x86 intel cpu-architecture memory-barriers micro-architecture
我有以下代码片段(可以在此处找到要点),其中我尝试对 4 个 int32_t 负值和 4 个 int16_t 值(将符号扩展为 int32_t)之间进行求和。
extern exit
global _start
section .data
a: dd -76, -84, -84, -132
b: dw 406, 406, 406, 406
section .text
_start:
movdqa xmm0, [a]
pmovsxwd xmm2, [b]
paddq xmm0, xmm2
;Expected: 330, 322, 322, 274
;Results: 330, 323, 322, 275
call exit
Run Code Online (Sandbox Code Playgroud)
然而,当通过我的调试器时,我无法理解为什么输出结果与预期结果不同。任何想法 ?
我正在使用grails运行一个进程,将信息从电子表格加载到数据库中.
我的本地机器有4GB内存和iCore7 1.73GHZ处理器服务器机器有2GB内存和一个Intel E7400 2.8GHZ双核都有500GB硬盘
您可以在下面看到将电子表格中的不同信息加载到数据库中的时间(以秒为单位).
SERVER UBUNTU 9.04 64BIT
LOAD DICTIONARY TABLES STARTING...
LOAD DICTIONARY TABLES : TOTAL Processing time = 5.31
2011-05-30 11:49:39,210 [main] DEBUG dataImport.CatalogueDataLoader - LOADING CATALOGUE...
2011-05-30 11:49:39,582 [main] DEBUG dataImport.CatalogueDataLoader - CATALOGUE LOAD : TOTAL Processing time 0.371
LOCAL UBUNTU 10.10 64BIT
LOAD DICTIONARY TABLES STARTING...
LOAD DICTIONARY TABLES : TOTAL Processing time = 32.641
2011-05-30 12:36:38,875 [main] DEBUG dataImport.CatalogueDataLoader - LOADING CATALOGUE...
2011-05-30 12:36:40,214 [main] DEBUG dataImport.CatalogueDataLoader - CATALOGUE LOAD : TOTAL Processing …Run Code Online (Sandbox Code Playgroud) 我在上一个项目中主要使用gcc,今天我决定对不同编译器的结果进行基准测试.
我使用了与Visual Studio 2010和英特尔C++相同的gcc 4.5,MSVC源代码.该程序从文本文件中获取输入,进行大量字符串操作并将输出写入另一个文本文件.
我只计算时间o
编辑:基准测试:
我只计算执行算法的时间,而不是文件io.基本上我放了
Run Code Online (Sandbox Code Playgroud)
在功能的开头和
clock_t clock0;
double z;
clock0 = clock();
之后.
double clock1=(clock() - clock0) / (double) CLOCKS_PER_SEC;
它从一个小文件(大约200行)开始,几乎没有差异(大约<0.15秒).使用4K行文件,MSVC的输出工作时间为1.23秒,而gcc的输出为0.1.
最后我测试了60K行文件:
Run Code Online (Sandbox Code Playgroud)
(program compiled with ) Intel compiler ran for 6.7 sec and with gcc : 1 sec.
现在我只是想知道为什么会有这样的差异(没有优化标志)以及可能是什么原因.(我使用c ++ 0x标准 - 但显然英特尔编译器支持它.)我不确定是否有这样的事实我的代码只用一个编译器编译成快速二进制文件并不令人担忧
编辑2:
我没有在MSVC或Intel的调试模式下编译它
在我迄今为止学到的关于分割的内容中:
所以,我的问题是:
基于我所读到的内容,虚拟地址被加载到段寄存器中,然后以某种方式从那里继续转换.在将虚拟地址加载到其中以获取描述符后,段寄存器会发生什么?
据我了解,段寄存器还包含描述符的缓存值.这在翻译过程中如何发挥作用?
系统如何确定要加载哪个段寄存器,假设段选择器最多可以有2 ^ 13个不同的值且只有6个主寄存器?
intel ×10
x86 ×3
x86-64 ×3
hardware ×2
linux ×2
performance ×2
assembly ×1
atomic ×1
c ×1
c++ ×1
compilation ×1
cpu-cache ×1
gcc ×1
grails ×1
python ×1
recursion ×1
sse ×1
ubuntu-10.10 ×1
visual-c++ ×1