2015-04-14 5 views
4

У меня есть распределенное приложение, которое использует MPI_Reduce() для некоторых сообщений. С точки зрения точности мы получаем полностью точные результаты с 16-битными числами с плавающей запятой (полуточность).16-бит float MPI_Reduce?

Чтобы ускорить обмен данными (уменьшая объем перемещения данных), существует ли способ вызвать MPI_Reduce() на 16-битных числах с плавающей запятой?


(Я посмотрел на документацию MPI и не видит никакой информации о 16-битных поплавки.)

+0

Привет, не возражаете ли вы принять мой ответ ниже? Благодаря! – Patrick

+0

Готово. Я надеялся поэкспериментировать с вашим кодом, прежде чем принимать его ... но, вероятно, будет еще несколько дней, прежде чем я попытаюсь это сделать. – solvingPuzzles

ответ

5

MPI Стандарт определяет только 32-бит (MPI_FLOAT) или 64-разрядный (MPI_DOUBLE) плавает во внутренних типах данных.

Однако вы всегда можете создать свой собственный MPI_Datatype и свою собственную операцию сокращения. В приведенном ниже коде представлено некоторое приблизительное представление о том, как вы можете это сделать. Поскольку неясно, какую 16-битную реализацию float вы используете, я буду ссылаться на тип просто как float16_t и операцию добавления как fp16_add().

// define custom reduce operation 
void my_fp16_sum(void* invec, void* inoutvec, int *len, 
       MPI_Datatype *datatype) { 
    // cast invec and inoutvec to your float16 type 
    float16_t* in = (float16_t)invec; 
    float16_t* inout = (float16_t)inoutvec; 
    for (int i = 0; i < *len; ++i) { 
     // sum your 16 bit floats 
     *inout = fp16_add(*in, *inout); 
    } 
} 

// ... 

// in your code: 

// create 2-byte datatype (send raw, un-interpreted bytes) 
MPI_Datatype mpi_type_float16; 
MPI_Type_contiguous(2, MPI_BYTE, &mpi_type_float16); 
MPI_Type_commit(&mpi_type_float16); 

// create user op (pass function pointer to your user function) 
MPI_Op mpi_fp16sum; 
MPI_Op_create(&my_fp16_sum, 1, &mpi_fp16sum); 

// call MPI_Reduce using your custom reduction operation 
MPI_Reduce(&fp16_val, &fp16_result, 1, mpi_type_float16, mpi_fp16sum, 0, MPI_COMM_WORLD); 

// clean up (freeing of the custom MPI_Op and MPI_Datatype) 
MPI_Type_free(&mpi_type_float16); 
MPI_Op_free(&mpi_fp16sum); 
+3

Вам не нужен вызов 'MPI_Type_commit()'. Также должно быть возможно злоупотреблять функцией взаимодействия языков в новых библиотеках MPI и использовать тип Fortran 'REAL * 2', например,' mpi_type_float16 = MPI_Type_f2c (MPI_REAL2); '. Он по-прежнему нуждается в пользовательском операторе сокращения, поскольку стандартные не работают на 'MPI_REAL2'. –

+0

Похоже, что 'REAL * 2' не поддерживается на x86, по крайней мере, GCC и Intel. –

+0

@HristoIliev благодарит! изм. – Patrick

Смежные вопросы