小编Mys*_*ial的帖子

C++内存分配问题

我的代码如下:

#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计算数量?

c++ memory visual-studio-2010

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

为什么底部测试循环更可取?

我听说有人说编译器经常将循环条件移到循环的底部.也就是说,像这样的循环:

while (condition) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

改为:

if (condition) {
     do {
         ...
     } while (condition);
}
Run Code Online (Sandbox Code Playgroud)

关于机器独立优化,为什么后者更可取?

compiler-construction x86 assembly gcc llvm

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

openMP - 与for循环和私有的并行化

我写了一个函数来评估集合(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++ multithreading openmp multiprocessing

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

为什么 C 中的线程函数返回类型需要是 (void*) 类型?

在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 *)

为什么?

谢谢 !

c multithreading pthreads

5
推荐指数
2
解决办法
4277
查看次数

为什么gcc只用_mm_set_ss添加这个movss指令?

使用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.

c optimization sse compiler-optimization

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

Visual Studio 2012中的_mm_prefetch在哪里?

我想使用指令_mm_prefetch.MSDN 指定它在头文件mmintrin.h中,但没有.我使用Visual Studio 2012.

c++ sse prefetch

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

如何确定未初始化变量的值?

鉴于以下计划:

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)

c++ initialization

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

性能调控器不会将CPU频率锁定在最大值

我正在专用的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内核设置为最大频率?

cpu performance scaling ondemand

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

使用多个处理器加速程序

我发现有时将一个循环划分为两个或更多循环会更快

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的赋值分成两个循环并不比一个循环快.

我认为操作系统使用一些规则来确定某些代码是否可以由多个处理器运行.

我想问一下我的猜测是否正确,如果我是对的,那么多个处理器将自动(没有线程编程)用于加速我的程序的规则或场合是什么?

c c++ parallel-processing performance

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

AVX512矢量长度和SAE控制

我的问题是关于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):

  1. CPU抛出异常.英特尔doc表4-7具有误导性.
  2. SAE有效,CPU仅以xmm运行,与标量运算相同.NASM和NDISASM做得对,英特尔文档是错误的.
  3. SAE被忽略,根据英特尔文档中的VMINPD规范,CPU以256位运行.NASM和NDISASM是错误的.
  4. SAE有效,CPU按指令代码指定的256位运行.NASM和NDISASM是错误的,英特尔doc需要用{sae}补充装饰xmm/ymm指令.
  5. SAE有效,CPU运行时隐含的全向量大小为512位,与EVEX.L'L无关,就像允许静态舍入{er}一样.NDISASM和Intel doc表4-7都是错误的.

x86 assembly avx512

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