小编Arn*_*ein的帖子

对于嵌套的for循环,带有"collapse()"的OpenMP在没有的情况下表现更差

这是我的代码:

double res1[NNN];  
#pragma omp parallel for collapse(3) schedule(dynamic) 
for (int i=0; i<NNN; i++)
{
    for (int j=0;j<NNN;j++)
    {
        for (int k=0;k<NNN;k++)
        {
            res1[i] = log(fabs(i*j*k));
        }
    }
}
std::cout<< res1[10] << std::endl;
Run Code Online (Sandbox Code Playgroud)

当我使用collapse(3)它需要约50秒; 不collapse(3)只是〜6-7秒.我对这种行为感到非常困惑,因为我希望"崩溃"的表现要好于没有.

我错过了什么吗?


我做了一些实验,玩了不同的配置:

(NNN = 2500和24核)

  1. schedule(STATIC)&& collapse(3)- > ~54秒
  2. schedule(STATIC)&& collapse(2)- > ~~ 8秒
  3. schedule(STATIC)&& collapse(1)- > ~~ 8秒

我也按DYNAMIC计划进行了尝试,但需要花费大量时间(几分钟).


在我原来的问题中,我有4个DIM"for-loops"(4D阵列):51x23x51x23.

使用OpenMP/MPI最小化运行时间的最佳方法是什么?我总共有大约300个CPU内核.在这些核心上扩展阵列的最佳方法是什么?阵列的长度是灵活的(我可以通过某种方式将其与CPU的数量相匹配).

有什么建议?

performance openmp collapse

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

使用 MPI IO 并行输出到单个文件

我有一个非常简单的任务要做,但不知何故我仍然陷入困境。

我有一个大数据文件(“File_initial.dat”),应该由集群上的所有节点读取(使用 MPI),每个节点都会对此大文件的一部分(File_size / number_of_nodes)执行一些操作,最后对每个节点执行一些操作会将其结果写入一个共享的大文件(“File_final.dat”)。文件的元素数量保持不变。

  1. 通过谷歌搜索,我了解到,将数据文件写入二进制文件(我在这个文件中只有十进制数字)而不是 *.txt”文件要好得多。因为没有人会读取这个文件,而只会读取计算机。

  2. 我尝试自己实现(但使用格式化的输入/输出而不是二进制文件),但我得到了不正确的行为。

到目前为止我的代码如下:

#include <fstream>
#define NNN 30

int main(int argc, char **argv)
{   
    ifstream fin;

    // setting MPI environment

    int rank, nprocs;
    MPI_File file;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    // reading the initial file

    fin.open("initial.txt");
    for (int i=0;i<NNN;i++)
    {  
        fin  >> res[i];
        cout << res[i] << endl; // to see, what I have in the file
    }  
    fin.close();

    // starting position in the "res" array as a function of "rank" of process …
Run Code Online (Sandbox Code Playgroud)

io parallel-processing mpi output

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

将表(双打)写入二进制文件 IO C++

我需要写一个四列的矩阵(“g_Grid.r”、“g_Grid.t”、“g_Grid.b”、“g_Grid.ph”)

通常,我使用文件流写入文件:

ofstream fout; 
fout.open("GRID.dat");
 for (int m=0;m<N_PH;++m)
    {   
    for (int k=0;k<N_B;++k)
        {
          for (int j=0;j<N_T;++j)
            {   
            for (int i=0;i<N_R;++i)
                {
                  fout << setprecision(32) << g_Grid.r[i]<<" "<<g_Grid.t[j]<<" "<<g_Grid.b[k]<<" "<<g_Grid.ph[m]<< endl;

                }
            }
        }
    }
 fout.close();
Run Code Online (Sandbox Code Playgroud)

它工作正常,但现在我正在处理非常大(长)的矩阵,编写格式化输出(“.txt”)需要很长时间。因为我真的不需要格式化文件,所以它更喜欢把它写成二进制文件。

问题:给定四个向量/数组(r、t、b、ph),如何将写入二进制文件?(我后面用matlab读取这个文件,也需要把它当成二进制表来读取)

编辑

通常,我使用以下简单代码来编写二进制文件:

ofstream myFile (fileName, ios::out | ios::binary);
double val;
for (int m=0;m<N_PH;++m)
    {   
    for (int k=0;k<N_B;++k)
        {
          for (int j=0;j<N_T;++j)
            {   
            for (int i=0;i<N_R;++i)
                {
                  val = g_N.Amp[m][k][j][i];
                  myFile.write(reinterpret_cast<const char*>(&val), sizeof(val));
                }
            }
        }
    }
myFile.close();
Run Code Online (Sandbox Code Playgroud)

但是这个只会产生“一列”,而稍后将被 matlab 读取。

c++ io binary-data

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

在matlab表中查找行

我是 Matlab 的新手,很抱歉这个非常简单的问题。给定一个表:

>> T = table(['MALE';'MALE';'FEMA';'FEMA';'FEMA'],[38;43;38;40;49],[71;69;64;67;64],[176;163;131;133;119])

T = 

    Var1    Var2    Var3    Var4
    ____    ____    ____    ____

    MALE    38      71      176 
    MALE    43      69      163 
    FEMA    38      64      131 
    FEMA    40      67      133 
    FEMA    49      64      119 
Run Code Online (Sandbox Code Playgroud)

如何访问'FEMA'仅包含 的行?

天真地,我会写成:

>> T(T.Var1 == 'FEMA',:)
Run Code Online (Sandbox Code Playgroud)

要得到

ans = 

Var1    Var2    Var3    Var4
____    ____    ____    ____

FEMA    38      64      131 
FEMA    40      67      133 
FEMA    49      64      119
Run Code Online (Sandbox Code Playgroud)

matlab slice

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