MPI - 将文件路径分散到进程
MPI - scattering filepaths to processes
我在 global_filetable 中有 4 个文件路径,我正在尝试将 2 个文件路径分散到每个进程。
进程 0 有正确的 2 个路径,但进程 1 (null) 中有些奇怪的东西...
编辑:
这是完整的代码:
#include <stdio.h>
#include <limits.h> // PATH_MAX
#include <mpi.h>
int main(int argc, char *argv[])
{
char** global_filetable = (char**)malloc(4 * PATH_MAX * sizeof(char));
for(int i = 0; i < 4; ++i) {
global_filetable[i] = (char*)malloc(PATH_MAX *sizeof(char));
strncpy (filetable[i], "/path/", PATH_MAX);
}
/*for(int i = 0; i < 4; ++i) {
printf("%s\n", global_filetable[i]);
}*/
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char));
MPI_Scatter(global_filetable, 2*PATH_MAX, MPI_CHAR, local_filetable, 2*PATH_MAX , MPI_CHAR, 0, MPI_COMM_WORLD);
{
/* now all processors print their local data: */
for (int p = 0; p < size; ++p) {
if (rank == p) {
printf("Local process on rank %d is:\n", rank);
for (int i = 0; i < 2; i++) {
printf("path: %s\n", local_filetable[i]);
}
}
MPI_Barrier(MPI_COMM_WORLD);
}
}
MPI_Finalize();
return 0;
}
输出:
Local process on rank 0 is:
path: /path/
path: /path/
Local process on rank 1 is:
path: (null)
path: (null)
你知道我为什么会有这些空值吗?
第一,你的分配不一致:
char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char));
类型char**
表示char*
的数组,但你分配了一个连续的内存块,这将表示char*
。
最简单的方法是将连续内存用作全局和本地 filetable
的 char*
。根据 get_filetable()
实际执行的操作,您可能需要进行转换。然后你可以像这样索引它:
char* entry = &filetable[i * PATH_MAX]
然后您可以像这样简单地散布:
MPI_Scatter(global_filetable, 2 * PATH_MAX, MPI_CHAR,
local_filetable, 2 * PATH_MAX, MPI_CHAR, 0, MPI_COMM_WORLD);
请注意,没有更多的位移,每个等级只获得大小相等的连续内存块。
下一步将是定义封装 PATH_MAX
字符的 C 和 MPI 结构,这样您就可以摆脱 PATH_MAX
和粗索引的常量用法。
我认为这比使用实际 char**
好得多(更简单,内存管理更少)。只有当内存浪费或冗余数据传输成为问题时,您才需要它。
P.S。确保永远不要在 filetable
条目中输入超过 PATH_MAX - 1
个字符,以便为尾部 [=24=]
.
保留 space
好吧,我傻了
char global_filetable[NUMBER_OF_STRINGS][PATH_MAX];
for(int i = 0; i < 4; ++i) {
strcpy (filetable[i], "/path/");
}
char local_filetable[2][PATH_MAX];
现在可以了!
我在 global_filetable 中有 4 个文件路径,我正在尝试将 2 个文件路径分散到每个进程。
进程 0 有正确的 2 个路径,但进程 1 (null) 中有些奇怪的东西...
编辑: 这是完整的代码:
#include <stdio.h>
#include <limits.h> // PATH_MAX
#include <mpi.h>
int main(int argc, char *argv[])
{
char** global_filetable = (char**)malloc(4 * PATH_MAX * sizeof(char));
for(int i = 0; i < 4; ++i) {
global_filetable[i] = (char*)malloc(PATH_MAX *sizeof(char));
strncpy (filetable[i], "/path/", PATH_MAX);
}
/*for(int i = 0; i < 4; ++i) {
printf("%s\n", global_filetable[i]);
}*/
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char));
MPI_Scatter(global_filetable, 2*PATH_MAX, MPI_CHAR, local_filetable, 2*PATH_MAX , MPI_CHAR, 0, MPI_COMM_WORLD);
{
/* now all processors print their local data: */
for (int p = 0; p < size; ++p) {
if (rank == p) {
printf("Local process on rank %d is:\n", rank);
for (int i = 0; i < 2; i++) {
printf("path: %s\n", local_filetable[i]);
}
}
MPI_Barrier(MPI_COMM_WORLD);
}
}
MPI_Finalize();
return 0;
}
输出:
Local process on rank 0 is:
path: /path/
path: /path/
Local process on rank 1 is:
path: (null)
path: (null)
你知道我为什么会有这些空值吗?
第一,你的分配不一致:
char** local_filetable = (char**)malloc(2 * PATH_MAX * sizeof(char));
类型char**
表示char*
的数组,但你分配了一个连续的内存块,这将表示char*
。
最简单的方法是将连续内存用作全局和本地 filetable
的 char*
。根据 get_filetable()
实际执行的操作,您可能需要进行转换。然后你可以像这样索引它:
char* entry = &filetable[i * PATH_MAX]
然后您可以像这样简单地散布:
MPI_Scatter(global_filetable, 2 * PATH_MAX, MPI_CHAR,
local_filetable, 2 * PATH_MAX, MPI_CHAR, 0, MPI_COMM_WORLD);
请注意,没有更多的位移,每个等级只获得大小相等的连续内存块。
下一步将是定义封装 PATH_MAX
字符的 C 和 MPI 结构,这样您就可以摆脱 PATH_MAX
和粗索引的常量用法。
我认为这比使用实际 char**
好得多(更简单,内存管理更少)。只有当内存浪费或冗余数据传输成为问题时,您才需要它。
P.S。确保永远不要在 filetable
条目中输入超过 PATH_MAX - 1
个字符,以便为尾部 [=24=]
.
好吧,我傻了
char global_filetable[NUMBER_OF_STRINGS][PATH_MAX];
for(int i = 0; i < 4; ++i) {
strcpy (filetable[i], "/path/");
}
char local_filetable[2][PATH_MAX];
现在可以了!