标签: intel

模运算向量化

有一个循环:

 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)

那么速度不会增加:(

c intel vectorization

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

如何应用GoogleColab更强的CPU和更多的RAM?

我使用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 核心吗?

python recursion intel data-structures google-colaboratory

1
推荐指数
1
解决办法
2万
查看次数

Skylake 和较新的环形巴士

在 Intel Skylake 及更新版本中,每个核心的内存子系统可以直接参与环形总线流量吗?这个框图(以及随附的信息)似乎表明了这一点。

如果是这样,子系统的哪一部分被连接?

  • L2?
  • 行填充缓冲区以方便 NT 存储?

x86 intel cpu-architecture cpu-cache

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

如何在 Linux 中汇编、链接和运行 .s 文件?

当我尝试使用 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)

我只是不明白发生了什么事。显然,这是为了学校作业。显然,我不是在寻找作业的答案,但这是我可以实际开始编码的起点。我只是不知道如何简单地运行该程序,作业中没有说明这一点。不管怎样,先谢谢大家了!

linux assembly compilation intel

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

平均而言,现代 x64 CPU cmpxchg16b 比 64 位或 32 位 CPU 慢得多?

我相信 Windows 已经在内部使用该指令很长时间了,所以 CPU 制造商会花精力去优化吗?

当然,假设适当对齐的内存和不共享缓存线等。

performance x86-64 atomic intel amd-processor

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

Intel X86如何实现全店排序

由于其 TSO 内存模型,X86 保证所有商店的总顺序。我的问题是是否有人知道这是如何实际实施的。

我对所有 4 个围栏是如何实现的印象很好,所以我可以解释如何保留本地秩序。但是 4 个栅栏只会给 PO;它不会给您 TSO(我知道 TSO 允许旧商店跳到新负载前面,因此只需要 4 个围栏中的 3 个)。

单个地址上所有内存操作的总顺序是一致性的责任。但我想知道英特尔(特别是 Skylake)如何在多个地址的商店上实现总订单。

x86 intel cpu-architecture memory-barriers micro-architecture

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

int32_t 和 int16_t 之间的 sse4 压缩和(符号扩展至 int32_t)

我有以下代码片段(可以在此处找到要点),其中我尝试对 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)

然而,当通过我的调试器时,我无法理解为什么输出结果与预期结果不同。任何想法 ?

linux sse x86-64 intel

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

我不明白这个性能问题

我正在使用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)

hardware performance grails intel ubuntu-10.10

0
推荐指数
1
解决办法
121
查看次数

使用不同编译器生成的二进制文件速度差异太大(C++)

我在上一个项目中主要使用gcc,今天我决定对不同编译器的结果进行基准测试.

我使用了与Visual Studio 2010和英特尔C++相同的gcc 4.5,MSVC源代码.该程序从文本文件中获取输入,进行大量字符串操作并将输出写入另一个文本文件.

我只计算时间o

编辑:基准测试:
我只计算执行算法的时间,而不是文件io.基本上我放了

    clock_t clock0;
    double z;
    clock0 = clock();

Run Code Online (Sandbox Code Playgroud) 在功能的开头和
    double clock1=(clock() - clock0) / (double) CLOCKS_PER_SEC;


之后.

它从一个小文件(大约200行)开始,几乎没有差异(大约<0.15秒).使用4K行文件,MSVC的输出工作时间为1.23秒,而gcc的输出为0.1.

最后我测试了60K行文件:

  (program compiled with ) Intel compiler ran for 6.7 sec and with  gcc : 1 sec.
Run Code Online (Sandbox Code Playgroud)

现在我只是想知道为什么会有这样的差异(没有优化标志)以及可能是什么原因.(我使用c ++ 0x标准 - 但显然英特尔编译器支持它.)我不确定是否有这样的事实我的代码只用一个编译器编译成快速二进制文件并不令人担忧

编辑2:

我没有在MSVC或Intel的调试模式下编译它

c++ gcc intel visual-c++

0
推荐指数
3
解决办法
566
查看次数

段寄存器如何参与内存地址转换?

在我迄今为止学到的关于分割的内容中:

  • 虚拟地址包含段选择器和偏移量
  • 段选择器与GDTR结合使用以查找段描述符的线性地址
  • 段描述符包含有关所选段的信息,包括其线性地址

所以,我的问题是:

  • 基于我所读到的内容,虚拟地址被加载到段寄存器中,然后以某种方式从那里继续转换.在将虚拟地址加载到其中以获取描述符后,段寄存器会发生什么?

  • 据我了解,段寄存器还包含描述符的缓存值.这在翻译过程中如何发挥作用?

  • 系统如何确定要加载哪个段寄存器,假设段选择器最多可以有2 ^ 13个不同的值且只有6个主寄存器?

hardware x86 x86-64 intel cpu-registers

0
推荐指数
1
解决办法
405
查看次数