我的代码如下:
#include <string.h>
int main()
{
int ii = 123;
char str[7] = "";
strcpy(str,"123456");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在VS2010中运行它,内存如下

我很好奇cc内存中的内容是什么?以及如何cc计算数量?
我听说有人说编译器经常将循环条件移到循环的底部.也就是说,像这样的循环:
while (condition) {
...
}
Run Code Online (Sandbox Code Playgroud)
改为:
if (condition) {
do {
...
} while (condition);
}
Run Code Online (Sandbox Code Playgroud)
关于机器独立优化,为什么后者更可取?
我写了一个函数来评估集合(set_)中的点的给定函数.没有并行化的代码是这样的:
void Method::evaluateSet(double* funcEvals_, double** set_)
{
for(int j= 0;j<m_npts;j++)
{
if(!(isInsideConstraints(set_[j])) || qIsNaN(funcEvals_[j]) || !qIsFinite(funcEvals_[j]))
{
funcEvals_[j] = DBL_MAX;
}
else
{
solverInput input_(m_input);
input_.setFunParameters(simplex_[j]);
funcEvals_[j]=input_.apply(simplex_[j]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是正常的.
然后我使用openMP并行化,使用并行构造,并为每个线程提供变量set_的私有副本.循环是
#pragma omp parallel for private (set_)
for(int j= 0;j<m_npts;j++)
{
if(!(isInsideConstraints(set_[j])) || qIsNaN(funcEvals_[j]) || !qIsFinite(funcEvals_[j]))
{
funcEvals_[j] = DBL_MAX;
}
else
{
solverInput input_(m_input);
input_.setFunParameters(set_[j]);
funcEvals_[j]=input_.apply(set_[j]);
}
}
#pragma omp barrier
Run Code Online (Sandbox Code Playgroud)
它会崩溃,如果评估,则会发生错误set_ is being used without been initialized.我不明白.既然我将set_变量设置为私有,那么set_每个线程中是否应该有原始副本?
代码有什么问题以及如何改进?
感谢致敬.
在c中,我们创建一个线程,如下所示:
void * run(void * arg){
printf("hello world\n");
}
int main(){
pthread_t thread;
int a = pthread_create(&thread, NULL, run, (void*)0);
}
Run Code Online (Sandbox Code Playgroud)
但如果我声明运行为,它将不起作用
void run(){}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我将其强制转换(void *)为 的参数pthread_create,则效果很好。因此它只接受返回类型为 的函数(void *)。
为什么?
谢谢 !
使用SSE考虑这两个函数:
#include <xmmintrin.h>
int ftrunc1(float f) {
return _mm_cvttss_si32(_mm_set1_ps(f));
}
int ftrunc2(float f) {
return _mm_cvttss_si32(_mm_set_ss(f));
}
Run Code Online (Sandbox Code Playgroud)
对于任何输入,两者的行为完全相同.但是汇编器输出是不同的:
ftrunc1:
pushl %ebp
movl %esp, %ebp
cvttss2si 8(%ebp), %eax
leave
ret
ftrunc2:
pushl %ebp
movl %esp, %ebp
movss 8(%ebp), %xmm0
cvttss2si %xmm0, %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
也就是说,额外ftrunc2使用一条movss指令!
这是正常的吗?有关系吗?当你只需要设置底部元素时,应该_mm_set1_ps总是优先考虑_mm_set_ss吗?
使用的编译器是GCC 4.5.2 -O3 -msse.
我想使用指令_mm_prefetch.MSDN 指定它在头文件mmintrin.h中,但没有.我使用Visual Studio 2012.
鉴于以下计划:
int main()
{
short myVariableName1; // stores from -32768 to +32767
short int myVariableName2; // stores from -32768 to +32767
signed short myVariableName3; // stores from -32768 to +32767
signed short int myVariableName4; // stores from -32768 to +32767
unsigned short myVariableName5; // stores from 0 to +65535
unsigned short int myVariableName6; // stores from 0 to +65535
int myVariableName7; // stores from -32768 to +32767
signed int myVariableName8; // stores from -32768 to +32767
unsigned int myVariableName9; // …Run Code Online (Sandbox Code Playgroud) 我正在专用的X3440服务器上运行实时应用程序,并想知道为什么应用程序性能比我以前的VPS盒差.然后我下载http://i7z.googlecode.com/svn/trunk/i7z_64bit并执行它以查看在正常使用情况下(在10%左右的CPU中),所有CPU内核仅保持在900Mhz~1200Mhz左右,并且波动很快并且不一致.
然后我尝试将调控器从ondemand设置为performance(echo performance>/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor),我的应用程序运行得更好,因为现在所有的CPU核心都保持在1700~1900Mhz左右(仍在波动) ,但应用程序性能仍然不符合我的标准.
我试图通过输入"service cpuspeed stop"来完全禁用任何缩放,它仍然显示与性能调控器相同的结果.我想知道为什么性能调控器没有锁定最高CPU频率.
然后我尝试在每个核心中运行4个独立的虚拟低优先级任务:yum install gcc
纳米虚拟
内容:
int main() {
while(1);
}
Run Code Online (Sandbox Code Playgroud)
gcc dummy.c -o dummy
nice taskset -c 0 ./dummy & nice taskset -c 1 ./dummy & nice taskset -c 2 ./dummy & nice taskset -c 3 ./dummy &
Run Code Online (Sandbox Code Playgroud)
这样,所有4个内核将保持在2533mhz并且不再波动(无论调控器设置如何),现在我的应用程序表现非常出色并且没有任何抱怨.但是,我不喜欢这些任务浪费资源的方式,即使它不会干扰主应用程序,因为它的优先级较低.
我的问题:在我的家用台式机Windows电脑中,不知怎的,我的CPU速度总是以最大频率稳定.但为什么在这个CentOS 6 2.6.32 x86_64专用服务器上没有发生这种情况呢?有没有办法在不使用任何优秀的低优先级任务的情况下将所有cpu内核设置为最大频率?
我发现有时将一个循环划分为两个或更多循环会更快
for (i=0; i<AMT; i++) {
a[i] += c[i];
b[i] += d[i];
}
||
\/
for (i=0; i<AMT; i++) {
//a[i] += c[i];
b[i] += d[i];
}
for (i=0; i<AMT; i++) {
a[i] += c[i];
//b[i] += d[i];
}
Run Code Online (Sandbox Code Playgroud)
在我的桌面上,win7,AMD Phenom(tm)x6 1055T,双循环版本运行速度更快,时间缩短了约1/3.
但如果我正在处理任务,
for (i=0; i<AMT; i++) {
b[i] = rand()%100;
c[i] = rand()%100;
}
Run Code Online (Sandbox Code Playgroud)
将b和c的赋值分成两个循环并不比一个循环快.
我认为操作系统使用一些规则来确定某些代码是否可以由多个处理器运行.
我想问一下我的猜测是否正确,如果我是对的,那么多个处理器将自动(没有线程编程)用于加速我的程序的规则或场合是什么?
我的问题是关于EVEX编码不四舍五入语义打包REG-REG的指令允许SAE控制(禁止所有的例外),如VMIN*,*VCVTT,VGETEXT*,VREDUCE*,VRANGE*等英特尔只全声明SAE-意识512位向量长度,例如
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}
Run Code Online (Sandbox Code Playgroud)
但我没有看到为什么SAE不能应用于使用xmm或ymm寄存器的指令的原因.
在英特尔指令集扩展编程参考的第4.6.4章中, 表4-7表示在没有舍入语义位的指令中,EVEX.b指定应用SAE,并且位EVEX.L'L指定显式向量长度:
00b: 128bit (XMM)
01b: 256bit (YMM)
10b: 512bit (ZMM)
11b: reserved
Run Code Online (Sandbox Code Playgroud)
所以他们的组合应该是合法的.
然而,NASM汇编vminpd zmm1,zmm2,zmm3,{sae} 为62F1ED185DCB,即EVEX.L'L = 00b,EVEX.b = 1,由NDISASM 2.12反汇编为vminpd xmm1,xmm2,xmm3
NASM拒绝组装vminpd ymm1,ymm2,ymm3,{sae}
,NDISASM将62F1ED385DCB(EVEX.L'L = 01b,EVEX.b = 1)拆解为vminpd xmm1,xmm2,xmm3
我想知道Knights Landing CPU是如何执行的VMINPD ymm1, ymm2, ymm3{sae}
(组装为62F1ED385DCB,EVEX.L'L = 01b,EVEX.b = 1):