这是我的代码:
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核)
schedule(STATIC)&& collapse(3)- > ~54秒schedule(STATIC)&& collapse(2)- > ~~ 8秒schedule(STATIC)&& collapse(1)- > ~~ 8秒我也按DYNAMIC计划进行了尝试,但需要花费大量时间(几分钟).
在我原来的问题中,我有4个DIM"for-loops"(4D阵列):51x23x51x23.
使用OpenMP/MPI最小化运行时间的最佳方法是什么?我总共有大约300个CPU内核.在这些核心上扩展阵列的最佳方法是什么?阵列的长度是灵活的(我可以通过某种方式将其与CPU的数量相匹配).
有什么建议?
我有一个非常简单的任务要做,但不知何故我仍然陷入困境。
我有一个大数据文件(“File_initial.dat”),应该由集群上的所有节点读取(使用 MPI),每个节点都会对此大文件的一部分(File_size / number_of_nodes)执行一些操作,最后对每个节点执行一些操作会将其结果写入一个共享的大文件(“File_final.dat”)。文件的元素数量保持不变。
通过谷歌搜索,我了解到,将数据文件写入二进制文件(我在这个文件中只有十进制数字)而不是 *.txt”文件要好得多。因为没有人会读取这个文件,而只会读取计算机。
我尝试自己实现(但使用格式化的输入/输出而不是二进制文件),但我得到了不正确的行为。
到目前为止我的代码如下:
#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) 我需要写一个四列的矩阵(“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 读取。
我是 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) io ×2
binary-data ×1
c++ ×1
collapse ×1
matlab ×1
mpi ×1
openmp ×1
output ×1
performance ×1
slice ×1