Инициализирует ли 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, зависит от реализации.

Другие вопросы по тегам