Parallel processing 是否可以在输出文件中并行写入数据

Parallel processing 是否可以在输出文件中并行写入数据,parallel-processing,mpi,writefile,Parallel Processing,Mpi,Writefile,是否可以使用更多处理器在单个输出文件上写入数据。我认为有些处理器有一部分数据(例如一个矩阵),整个矩阵应该写在一个输出文件中。是否每个处理器都可以并行地编写自己的部件(同时而不是一个接一个) Q:是否每个处理器都可以并行写入自己的部分(同时而不是一个接一个) 不,不是。写入是一个以纯粹的方式将原子信息片段(位放入磁带,字符放入文件抽象)的过程 如果有疑问,拿着5支铅笔(我做不到,所以想象一下你可以),试着在纸上写一个单词(由于“过程”——写作相关的环境——我们写作方式的独特性),在这个简化的例子

是否可以使用更多处理器在单个输出文件上写入数据。我认为有些处理器有一部分数据(例如一个矩阵),整个矩阵应该写在一个输出文件中。是否每个处理器都可以并行地编写自己的部件(同时而不是一个接一个)

Q:是否每个处理器都可以并行写入自己的部分(同时而不是一个接一个)

不,不是。写入是一个以纯粹的方式将原子信息片段(位放入磁带,字符放入文件抽象)的过程

如果有疑问,拿着5支铅笔(我做不到,所以想象一下你可以),试着在纸上写一个单词(由于“过程”——写作相关的环境——我们写作方式的独特性),在这个简化的例子中,不可能“写”5个独立的单词,即不同的单词

类似地,在其他形式的说明中——如果你有一台打字机(希望它不是那么古老的想象)——你可以得到5份相同的纯字符序列(由于在5张办公用纸之间填充了4张复写纸),然而,这些副本都不会与原件有所不同——因此它们不是独立的(就像在真正的
[并行]
过程中一样),而是一组副本,这是在一些管理矩阵中生成发送1份原件+4份副本的文书工作中对时间和资源的有效利用,但这不是一个真正的例子-
[PARALLEL]
写入

最后但并非最不重要的一点是,在打字机上打字(在纸上打印一系列字符)时,试图一次使用多于一个且仅使用一个手指的任何尝试都会产生机械堵塞,因为机械打字过程依赖于打印字符的奇点,通过一个墨水横幅,在一张纸上

现代的文件系统远不是这种简单的原型,而是有一个类似的概念,即生成和维护字符序列的纯[SERIAL]表示。即使可以打开更多可以“访问”此字符序列的文件句柄,但这并不意味着有机会将文件I/O操作反序列化,一次执行的操作越少(因为磁盘存储的多个不同位置没有磁头(磁带设备的操作越少)几乎是随机访问的设备,如SSD等,都不会立即失控,失去对低级性能的控制(磨损均衡、电梯优化、功率限制和类似的低级设备技巧)

Q:是否每个处理器都可以并行写入自己的部分(同时而不是一个接一个)

不,不是。写是一个以纯粹的方式将原子信息片段(位放入磁带,字符放入文件抽象)的过程

如果有疑问,拿着5支铅笔(我做不到,所以想象一下你可以),试着在纸上写一个单词(由于“过程”——写作相关的环境——我们写作方式的独特性),在这个简化的例子中,不可能“写”5个独立的单词,即不同的单词

类似地,在其他形式的说明中——如果你有一台打字机(希望它不是那么古老的想象)——你可以得到5份相同的纯字符序列(由于在5张办公纸之间填充了4张复写纸),但这些副本都不会与原始副本有所不同,因此它们不是独立的(就像在true中一样-
[PARALLEL]
过程)但只是一组副本,这是在一些管理矩阵中发送1份原件+4份副本的文书工作中对时间和资源的有效利用,而不是真正的
[PARALLEL]
写入

最后但并非最不重要的一点是,在打字机上一次使用多于一个且仅一个的手指打字的任何尝试(这会在纸上打印出一系列字符)会产生机械卡纸,因为机械打字的过程依赖于一个奇点,在这个奇点上,一个字符通过墨水横幅打印到一张纸上


现代的文件系统远不是这种简单的原型,而是有一个类似的概念,即生成和维护字符序列的纯表示形式这种字符序列并不意味着有机会将文件I/O操作反序列化,一次执行的操作越少(因为磁盘头不在磁盘存储的多个不同位置(磁带设备的操作越少)几乎是随机访问的设备,如SSD等,都不会立即失控,失去对低级属性的控制(磨损均衡、电梯优化、功率限制和类似的低级设备技巧)。

是的,这是绝对可能的,MPI为您提供了实现这一点的所有工具。

评论中已经链接了A。我只想用一个简单的例子来说明它

#include <stdint.h>
#include <mpi.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>

const int N = 1024ll * 1024 * 256 * 12;
const MPI_Datatype MPI_T = MPI_UINT64_T;
typedef uint64_t T;
const char* filename = "mpi.out";

int main() {
    MPI_Init(NULL, NULL);
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    assert(N % size == 0);
    T* my_part = calloc(N / size, sizeof(T));
    for (size_t i = 0; i < N / size; i++)
        my_part[i] = i + rank * (N / size);

    MPI_File fh;
    MPI_File_open(MPI_COMM_WORLD, filename,
                  MPI_MODE_WRONLY | MPI_MODE_CREATE, MPI_INFO_NULL,
                  &fh);
    MPI_File_set_view(fh, rank * (N / size) * sizeof(T), MPI_T, MPI_T,
                      "native", MPI_INFO_NULL);

    MPI_Barrier(MPI_COMM_WORLD);
    double begin = MPI_Wtime();
    MPI_File_write_all(fh, my_part, N / size, MPI_T, MPI_STATUS_IGNORE);
    MPI_Barrier(MPI_COMM_WORLD);
    double duration = MPI_Wtime() - begin;
    if (rank == 0)
        printf("Wrote %llu B in %f s, %f GiB/s\n",
               N * sizeof(T), duration,
               N * sizeof(T) / (duration * 1024 * 1024 * 1024));

    MPI_File_close(&fh);
    MPI_Finalize();
}
#包括
#包括
#包括
#包括
#包括
常数int N=1024ll*1024*256*12;
常量MPI_数据类型MPI_T=MPI_UINT64_T;
类型定义uint64\t;
const char*filename=“mpi.out”;
int main(){
MPI_Init(NULL,NULL);
int等级、大小;
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
断言(N%size==0);
T*my_part=calloc(N/尺寸,尺寸(T));
对于(大小i=0;i