我试图找出x86处理器遇到存储条件指令时的作用.例如,它是否会停止管道的前端并等待ROB缓冲区变为空,然后停止前端停止并执行SC?基本上它会迫使处理器变得非投机性......
谢谢
我一直在玩下面这段代码.file_string
返回一个临时字符串,该字符串只能"生效"直到语句结束.在Visual Studio 2008中,当您使用时pTempFolder
,它会按预期包含垃圾.但是在Linux中,使用英特尔编译器11.0 pTempFolder
仍然指向一个有效的字符串.编译器是否有关于临时销毁的不同政策,那种渴望(视觉)与懒惰(英特尔)?或许这只是一个巧合?
boost::filesystem wpathTempFolder("/tmp");
const wchar_t* const pTempFolder = wpathTempFolder.file_string().c_str();
// use pTempFolder
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这是boost文件系统版本2.我也看到file_string
在升级文件系统版本3 中已经被弃用.并且有一种新c_str
方法可以在字符串上运行,而不是在临时字符串上运行.
/*filesystem 2*/
const string_type file_string() const;
/*filesystem 3*/
const string_type& native() const; // native format, encoding
const value_type* c_str() const; // native().c_str()
Run Code Online (Sandbox Code Playgroud) 在装有Windows 7 OS的计算机中,我有来自此供应商的三个版本的OpenCL SDKS:
我与他们每个人建立我的应用程序。作为输出,我有三个不同的二进制文件。例如:my_app_intel_x86,my_app_amd_x86,my_app_nvidia_x86
此二进制文件与此不同:
我可以只使用一个SDK并检查平台的运行时间吗?
void task1(void* arg) {
static volatile long res = 1;
for (long i = 0; i < 100000000; ++i) {
res ^= (i + 1) * 3 >> 2;
}
}
Run Code Online (Sandbox Code Playgroud)
4个线程,同时工作,执行任务1 193周在30秒的时间.但4个过程中,同时工作,执行任务1 348周在30秒的时间.为什么会有这么大的差异?我在[Mac OS X 10.7.5,Intel Core i5(4个逻辑核心)]上测试了它.想想,在Windows和Linux中存在同样的差异.
我找到了这个opencl示例代码:
/*
* Simple OpenCL demo program
*
* Copyright (C) 2009 Clifford Wolf <clifford@clifford.at>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; …
Run Code Online (Sandbox Code Playgroud) 我是GPU计算领域的新手.所以我真的希望有人向我解释一下这些基础知识.我必须使用以下GPU的英特尔芯片组:
我感兴趣的是在GPU中运行具有大数据集的代数和按位函数,例如数组的转置或数组行的按位移位.目标当然是获得更多的表现.
我的主要问题是如何在GPU上编程?过去我曾使用CUDA在nVIDIA显卡上进行编程.我从之前的主题中了解到,我不能将CUDA用于INTEL GPU.提前致谢!!
更新1
我发现英特尔支持OpenCL用于高清显卡.更准确地说,适用于OpenCL应用程序的英特尔SDK为英特尔®平台上的OpenCL应用程序提供了全面的开发环境,包括兼容的驱动程序,代码示例,开发工具,如代码构建器,优化指南和对优化工具的支持.
SDK支持采用Intel®HDGraphics和Intel®Iris™图形系列的第3代和第4代Intel®Core™处理器上的OpenCL 1.2,采用Intel HD Graphics,Intel®Xeon®处理器和Intel®XeonPhi™的Intel®Atom™处理器协处理器.
在x86_64架构中,可以将一些指令操作数组合更改为较短的组合以实现相同的效果,但可执行文件较小.例如,通常写:
xor eax, eax
Run Code Online (Sandbox Code Playgroud)
代替:
xor rax, rax
Run Code Online (Sandbox Code Playgroud)
我想测试它,在汇编中编写简单的程序:
segment .text
global main
main:
push rbp
mov rbp, rsp
xor rax, rax ; line in question
leave
ret
Run Code Online (Sandbox Code Playgroud)
内置:
yasm -f elf64 -m amd64 -g dwarf2 main.asm; clang -o main main.o
Run Code Online (Sandbox Code Playgroud)
检查尺寸:
stat main
Run Code Online (Sandbox Code Playgroud)
拿到:
....
Size: 9184
...
Run Code Online (Sandbox Code Playgroud)
好的,将问题更改为:
xor eax, eax
Run Code Online (Sandbox Code Playgroud)
希望获得更小的可执行文件,但获得相同的9184字节大小.使用较短的指令表格为什么尺寸没有减少?
我有一个归零的128位寄存器,我想向左移位并添加一个字节.我可以改为:
pslldq xmm0, 1
Run Code Online (Sandbox Code Playgroud)
......但是现在我想将al复制到空白区域.就像是:
or xmm0, al
Run Code Online (Sandbox Code Playgroud)
这当然不起作用.我只希望受影响的最低8位.这将是一个循环,其中al的连续值将用于填充寄存器.所以我需要一些mov指令或其他替代方案.
理想的是单个指令向左移8位并插入,但我不认为存在这样的指令.
我花了很多时间在x86-64指令集数据中翻找,但找不到任何可以让我做我想做的事情.可以吗?
更新:尝试使用pinsrb后,我在代码逻辑中发现了一个错误.pinsrb会很棒但不幸的是它只能使用立即索引而不是寄存器.
我从非连续位置获取字节,所以我认为我需要一次一个字节.字节数可以是1到16之间的任何字节.我抓取的第一个字节应该以xmm0的最低字节结束,下一个字节进入下一个最低字节等.
我正在C中实现一个数学库,该数学库大量使用乘法。最初,我所有的乘法都是使用进行的uint16_t
。最近,我将其中的许多更改为,uint32_t
然后发现我的代码运行时间几乎翻了一番。正如我在Intel x64处理器中所认为的那样,我感到困惑,32位和16位乘法需要相同的时钟周期。我写了诊断代码,请在下面找到
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include "cpucycles.c"
#define REPEAT 10000
#define OUT_REPEAT 100000
void main(){
uint16_t a_16[REPEAT], b_16[REPEAT], c_16[REPEAT];
uint32_t a_32[REPEAT], b_32[REPEAT], c_32[REPEAT];
int32_t i,j;
uint64_t clock1, clock2, CLOCK16, CLOCK32;
uint64_t acc=0;
time_t t;
srand((unsigned) time(&t));
clock1=clock2=CLOCK16=CLOCK32=0;
for(j=0;j<OUT_REPEAT;j++){
for(i=0;i<REPEAT;i++){
a_16[i]=rand()& ( (1<<13) -1); //need 13-bit integers only
b_16[i]=rand()& ( (1<<13) -1);
a_32[i]=rand()&( (1<<19) -1);
b_32[i]=rand()&( (1<<19) -1); //need 19-bit integers only
}
clock1=cpucycles();
for(i=0;i<REPEAT;i++){
c_16[i]=a_16[i]*b_16[i];
}
clock2=cpucycles();
CLOCK16=CLOCK16+(clock2-clock1);
clock1=cpucycles();
for(i=0;i<REPEAT;i++){
c_32[i]=a_32[i]*b_32[i]; …
Run Code Online (Sandbox Code Playgroud) 为了访问PCI配置空间,根据各种文章,使用I / O端口地址0xCF8、0xCFC。
mov eax, dword 0x80000000
mov dx, word 0x0CF8
out dx, eax
mov dx, word 0x0CFC
in eax, dx
Run Code Online (Sandbox Code Playgroud)
上面代码中eax的值是0x12378086
,表示vendor ID = 0x8086
和device ID = 0x1237
。
这是问题。
Q1。我已经看到此方法仅适用于PCI配置空间。那么,访问PCIe配置空间的另一种方法是什么?
“ 无法使用传统的PCI方法(通过端口0xCF8和0xCFC)访问此扩展的配置空间”
https://wiki.osdev.org/PCI_Express
但是另一些文章说,这种传统方法也与PCIe配置空间兼容。
这很混乱。
Q2。如果传统的0xCF8、0xCFC也可以与PCIe配置空间配合使用,那么将不胜枚举NASM汇编源代码(不涉及linux),因为我看过很多ECAM(增强型配置访问机制)文章,但所有这些都是关于概念性内容。
硬件规格:
Motherboard : P775TM1
Processor : Intel i7 8700K
Run Code Online (Sandbox Code Playgroud) intel ×10
assembly ×3
opencl ×3
c ×2
c++ ×2
gpu ×2
x86 ×2
architecture ×1
base-address ×1
clock ×1
instructions ×1
linux ×1
nvidia ×1
pci ×1
pci-e ×1
performance ×1
processors ×1
simd ×1
sse ×1
x86-64 ×1
xorg ×1