我有一个功能,这是我的程序的瓶颈.它不需要访问内存,只需要计算.它是内循环并被多次调用,所以这个函数的任何小增益都是我程序的大胜利.
我来自PS3优化SPU代码的背景,您可以在其中获取SPU程序并通过管道分析器运行它,您可以将每个汇编语句放在其自己的列中,并最小化函数所需的循环量.然后重叠循环,以便最大限度地减少管道依赖性.使用该程序和每个汇编指令所需的所有循环列表,我可以比编译器更好地优化.
在不同的平台上,它有我可以注册的事件(缓存未命中,循环等),我可以运行该功能并跟踪CPU事件.这也很不错.
现在,我正在使用带有Core i7 Intel处理器的Visual Studio C++ 2010在Windows上做爱好项目.我没有钱来支付VTune的巨额费用.
我的问题:
如何在Windows的英特尔处理器的装配级别分析功能?
我想编译,查看反汇编,获取性能指标,调整我的代码并重复.
我是git并测试它的新手.我已经能够克隆一个朋友存储库进行小的本地更改并提交.
我现在想测试将我的本地更改推送到远程存储库但不幸的是当我尝试推送时
$ git push <my friends remote repository>
<----挂在这里等待..我突然被ctr-c打破了
以下是显示我当前状态的一些信息,
$ git remote show origin
获取URL:git://codaset.com/nickbmarine/nickspix.git
推送URL:git://codaset.com/nickbmarine/nickspix.git
HEAD分支:master
远程分支:
重构跟踪
主跟踪
本地分支配置为'git pull':
master与远程master合并
本地ref为'git push'配置:
master push to master(fast-forwardable)
有任何想法吗?
我试图找出一种有效的方法将编译时常量浮点数加载到SSE(2/3)寄存器中.我试过做这样简单的代码,
const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f };
Run Code Online (Sandbox Code Playgroud)
但是这会从内存中生成4个movss指令!
movss xmm0,dword ptr [__real@3f800000 (14048E534h)]
movss xmm1,dword ptr [__real@40000000 (14048E530h)]
movaps xmm6,xmm12
shufps xmm6,xmm12,0C6h
movss dword ptr [rsp],xmm0
movss xmm0,dword ptr [__real@40400000 (14048E52Ch)]
movss dword ptr [rsp+4],xmm1
movss xmm1,dword ptr [__real@40a00000 (14048E528h)]
Run Code Online (Sandbox Code Playgroud)
它将标量加载到内存中......(?!?!)
这样做虽然..
float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope
Run Code Online (Sandbox Code Playgroud)
产生.
movaps xmm5,xmmword ptr [::myarray4 (140512050h)]
Run Code Online (Sandbox Code Playgroud)
理想情况下,如果我有常量它们将是一种不甚至触摸内存的方式并且只是使用直接样式指令(例如编译到指令本身的常量).
谢谢
我发现这个程序的编译器之间存在一些不一致,
struct A {
};
struct B : public A {
float m;
};
struct C : public A {
B b;
float n;
};
struct D : public A {
float n;
B b;
};
static_assert(sizeof(A) == 1, "");
static_assert(sizeof(B) == 4, "");
static_assert(sizeof(C) == 8, ""); // most compilers say this is 12
static_assert(sizeof(D) == 8, "");
Run Code Online (Sandbox Code Playgroud)
大多数编译器断言sizeof(C)== 8说sizeof(C)实际上是12.我发现的唯一编译器没有,并说它是8是Microsoft Visual Studio 2010.
我被告知的原因是,比我更聪明的人,是B中有两个单独的A参考,需要保留彼此不同的个体偏移.首先,从C导出的A在偏移0处,并且第二个A内部成员b不能与第一个A在0处的偏移量相同,因此插入了4个字节的填充.
由于大多数编译器已经实现了这种行为,我想知道你需要什么案例来确保两个A都有不同的引用?寻找一些关于为什么会这样的直觉?
有人说这可能是标准要求的条件,我们很好奇它的原因是什么?
谢谢
我有一个函数,它接受一个unsigned long*并且需要将它传递给一个带有unsigned int*的外部库,并且在这个平台上unsigned int/long的大小相同.
void UpdateVar(unsigned long* var) {
// this function will change the value at the address of var
ExternalLibAtomicUpdateVar((unsigned int*)var); // lib atomically updates variable
}
Run Code Online (Sandbox Code Playgroud)
这会产生一个警告,说它违反了严格别名规则.有没有工作?
谢谢
编辑:我为不清楚而道歉.代码是一个原子更新,因此绕过库来存储它不是一个选项.我可以下载到汇编但我想在C++中这样做.
我有一个与此类似的功能签名
void Mutliply(const MatrixMN& a, const MatrixMN& b, MatrixMN& out);
Run Code Online (Sandbox Code Playgroud)
矩阵类在内部有一个float* data;代表m x n组件的类.我想告诉编译器,a并且b不要对out矩阵进行别名,因此它不会执行大量的加载存储.
我该怎么做呢?我知道我可以传入指向函数签名的指针并用__restrict(在MSVC中)标记指针但是我想保留通过引用传递的对象的习惯用法,其中对象包含指向内存的指针.
我也知道这__restrict对象引用不起作用.