小编pra*_*kar的帖子

#pragma结束时的隐含障碍

朋友们,我正在尝试学习openMP范例.我使用以下代码来理解pragma的#omp.

int main(void){
int tid;
int i;

omp_set_num_threads(5);
#pragma omp parallel \
    private(tid)
{
    tid=omp_get_thread_num();
    printf("tid=%d started ...\n", tid);
    fflush(stdout);

    #pragma omp for
    for(i=1; i<=20; i++){
        printf("t%d - i%d \n",
                omp_get_thread_num(), i);
        fflush(stdout);
    }

    printf("tid=%d work done ...\n", tid);
}

return 0;
Run Code Online (Sandbox Code Playgroud)

}

在上面的代码中,在#pragma omp parallel的末尾有一个隐式屏障,这意味着所有线程0,1,2,3,4必须到达那里才能进入下一个语句.

所以,为了检查这个障碍,我在条件if(tid!= 0)中包含了这个"pragma for",这意味着除了线程0之外的所有线程,即1,2,3,4应该在循环中完成它们的工作并等待thread0无限期.但是,令我惊讶的是,这种情况并没有发生.每个线程都在进行迭代并成功完成.即t1完成迭代5,6,7,8 ---- t2确实9,10,11,12 ---- t3确实13,14,15,16和t4确实17,18,19,20.请注意:迭代1,2,3,4从未完成.

为了深入挖掘,而不是tid!= 0,我在tid中包含了相同的#pragma!= 1意味着而不是thread0,thread1绕过了屏障.令我惊讶的是,程序现在挂起,所有线程都在等待thread1.

有人可以告诉我这种意外行为的解释.最终代码被绞死:

int main(void){
int tid;
int i;

omp_set_num_threads(5);
#pragma omp parallel \
    private(tid)
{
    tid=omp_get_thread_num();
    printf("tid=%d started ...\n", tid);
    fflush(stdout);

    if(tid!=1){
        /* worksharing */ …
Run Code Online (Sandbox Code Playgroud)

parallel-processing openmp openmpi

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

在L2驱逐中从L1缓存中缓存驱逐

我对内存系统遵循的策略有一个基本的问题.

考虑具有私有L1和L2缓存的核心.在L2缓存之后,我们有一条总线,在该总线上运行一致性流量.现在,如果从L2高速缓存中清除地址(X)的高速缓存行,是否有必要从L1高速缓存中逐出该地址?

驱逐的原因可能是它有助于维持一致性协议的不变性[如果l2中的一行显示无效,则此核心不包含此地址].

caching computer-architecture memory-size

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

当前正在执行的进程的pid

朋友们,我正在尝试跟踪操作系统的完整执行,包括在其上运行的进程.为此我想要每个进程执行的指令及其执行跟踪,我想这样做,而不必去做每个进程的objdump.

所以我的目标是:
1)建立每个pid的地址空间.
2)跟踪每个pid的执行情况.

为了实现上述目标,我在仿真器Qemu上运行基于Linux的操作系统.

当qemu第一次遇到指令时,我将使用guest虚拟机中的io-port或已知物理内存地址来检查运行此指令的进程的pid.然后我可以使用这些信息来做我想要的东西.

我的问题是......在kernel/sched.c中我可以知道接下来要执行的进程的pid.意味着我无法像 - > launch_process(pid)那样进行函数调用.有人请指点我在内核中的这个位置.或者系统中是否存在可以跟踪地址空间的已知位置.一个是CR3,但我真的不能相信它.

对于一些人来说,这似乎是指向这个位置的一个微不足道的指针,但我自己无法找到这个位置.

architecture linux scheduling linux-kernel

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

linux eth0不支持bridge

朋友们,我正在尝试使用linux bridge实用程序将我的qemu guest虚拟机连接到真正的网络.
为此,我使用非常简单的方法:

  1. 使用(sudo brctl addbr br0)在主机上创建桥接器
  2. 将eth0添加到此桥(sudo brctl addif br0 eth0)
  3. 更改了/ etc/qemu-ifup脚本(brctl addif br0 $ 1)
  4. 更改了/ etc/qemu-ifdown脚本(brctl delif br0 $ 1)

通过以上4个步骤,我得到了我的客人网络正常工作.但现在问题是我将eth0连接到桥接器br0后,我的主机网络无法正常工作.

我确认在step1和step2之后我的主机网络停止工作.但客人网络继续工作,这让我感到困惑.

有人可以指出这两行有什么问题吗?

  1. 使用(sudo brctl addbr br0)在主机上创建桥接器
  2. 将eth0添加到此桥(sudo brctl addif br0 eth0)

PS:我已经尝试了几乎所有在互联网上提供的方法,并且没有成功的任何方法.此外,我的问题与linux网络有关,特别是qemu

linux kvm qemu

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

静态和动态数组之间的区别

朋友我刚刚玩了一些指针程序,并意识到GCC(可能是C标准)区分静态和动态数组.

动态数组具有用于数组中元素地址的占位符,而对于静态数组,没有存储器位置,其中编译器存储元素数组的起始地址.

我有一个示例程序来证明我的困惑.

#include <iostream>
#int main(void)
{
  int _static[10];
  int *_dynamic;

  _dynamic = new int [10];

  std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl;
  std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于上面的程序,_static&_static[0]在预期的行上返回相同的地址.但是,&_static也返回与其他两个相同的地址.

所以,_static&_static参考相同的数字(或地址,无论我们想称之为什么).正如所料,_dynamic&_dynamic指出不同的位置.

那么,为什么C标准会说_static并且&_static必须引用相同的位置.这听起来令人困惑.我觉得的一个原因是&_static没有多大意义.但那么它的使用不应该被报告为错误吗?

有人可以帮我解决这个困惑吗?

c c++ compiler-construction gcc icc

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

gnuplot图2列的差异

我有两个文件A和B.两个文件包含2列,x和y.

现在,我想绘制x vs(yA - yB)的图形.gnuplot是否提供相同的命令?

还有一件事,让我们说xA和xB不一样.我应该如何绘制图形,其中x轴包含两者中的所有元素,xA和xB以及y轴的差异是相应的y分量?

plot gnuplot

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

在文件中打印最后n-2行的优雅方式

我想打印文件的最后n-2行,其中n是文件中的行数.这可以通过做n = wc -l-2然后再做tail -n $file.

但有没有更好的方法来做到这一点?我经常在bash中需要这个功能......

bash

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