Инициализирует ли MPI_File_write_at() файл нулями?
Рассмотрим следующую простую программу, которая записывает в файл ранг всех процессов, ранг которых больше нуля:
#include <mpi.h>
int main() {
MPI_Init(NULL, NULL);
int world_rank, world_size;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Offset offset;
MPI_Status status;
MPI_File fh;
MPI_File_open(MPI_COMM_WORLD, "myfile", MPI_MODE_CREATE | MPI_MODE_WRONLY,
MPI_INFO_NULL, &fh);
offset = world_rank * sizeof(int);
if (world_rank > 0) {
MPI_File_write_at(fh, offset, &world_rank, 1, MPI_INT, &status);
}
MPI_File_close(&fh);
MPI_Finalize();
return 0;
}
мы скомпилировали и запустили его на 4 процессах
mpic++ main.cpp
mpirun --oversubscribe -n 4 a.out
Проверяем записанный файл с
hexdump -C myfile
00000000 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 |................|
00000010
Теперь я никогда не делал вызов записи для первого целого числа, известного как первые 4 байта, но они равны нулю.
Могу ли я быть уверен , что они всегда равны нулю?
1 ответ
MPI_File_write_at
запишет данные в файл как
binary data
. Тогда при запуске команды эта команда будет отображать данные соответственно с первым
4 bytes
будучи смещением . Эти первые байты не являются частью двоичных данных per si , а добавляются для удобства чтения.
Шестнадцатеричный представляет
10000
в двоичном и десятичном виде. Если вы посмотрите на свою первую строку, игнорируя первые 4 байта:
4 bytes 4 bytes 4 bytes 4 bytes 4 bytes
00000000 | 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00
00000010 |
У вас есть
16
(4x4) байт, поэтому следующая строка начинается с
00000010
.
Могу ли я быть уверен, что они всегда равны нулю?
Что касается стандарта, то я там не нашел, прямо указывающего, что если пропустить начало файла
offset > 0
, что реализация MPI заполнит этот пробел нулями. Например, с версией MPI (Open MPI 1.8.8), которую я использую, если я изменю ваш код на:
if (world_rank == 3) {
MPI_File_write_at(fh, offset, &world_rank, 1, MPI_INT, &status);
}
Я получаю следующий вывод от
hexdump -C myfile
:
00000000 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 |................|
00000010
Итак, с версией MPI, которую я использую, и, по-видимому, с вашей, он инициализируется нулями.
Тем не менее, если не будет найден надежный источник (который мне не удалось найти), в котором прямо указано, что в вашем случае первые 4 байта всегда будут равны нулю, я бы посоветовал не делать никаких предположений на этот счет. Тем не менее, не следует заботиться о той части содержимого файла , которая не была записана процессами.
РЕДАКТИРОВАТЬ: разъяснение из «списка рассылки Open MPI»:
В общем, содержимое файла, записываемого интерфейсом ввода-вывода MPI, зависит от реализации.