Я новичок в MPI, поэтому извиняюсь, если это просто.
У меня есть код из месяца или двух go, который работал нормально, но я решил go вернуться и отредактируйте его. (Он был написан, когда я только начинал, и это не критичный для производительности раздел.) Код в основном генерирует случайный график для одного процесса, а затем делится результатами со всеми другими процессами. Ниже приводится отрывок из версии «Первые шаги ребенка»: правильный способ:
if (commrank == 0) {
graph = gengraph(params);
MPI_Bcast(graph, n*n, MPI_UNSIGNED, 0, MPI_COMM_WORLD);
} else {
graph = malloc(sizeof(unsigned int)*n*n);
MPI_Bcast(graph, n*n, MPI_UNSIGNED, 0, MPI_COMM_WORLD);
}
Проблема в том, что я продолжаю получать при компиляции с оптимизацией -O3 ошибки "разбивания стека" во второй версии, хотя при неоптимизированной компиляции все работает нормально. Обратите внимание, что я несколько раз проверял функцию распределения графа и отлаживал ее, и, похоже, все в порядке. Я также отладил вторую версию, и она, похоже, работает нормально. Ошибка sh возникает позже, когда я пытаюсь освободить графическую память. (Обратите внимание, что это не ошибка двойного освобождения, и, опять же, она отлично работает в наивной реализации и имеет некоторое время.) if вместо использования переменной recvStatus
я использую MPI_STATUS_IGNORE
. И, опять же, это не работает только с -O3.
Любые мысли были бы очень признательны. Если это поможет, я использую mpi cc поверх g cc 7.5.0, но я полагаю, что делаю что-то глупое, вместо того, чтобы столкнуться с проблемой компилятора.