Skip to content

Commit df977a4

Browse files
committed
some fixes for message related functions
also add better support for the 'some' test/wait functions. fix testall and startall Signed-off-by: Howard Pritchard <[email protected]>
1 parent 2ef211a commit df977a4

File tree

9 files changed

+125
-37
lines changed

9 files changed

+125
-37
lines changed

ompi/mpi/bindings/ompi_bindings/c.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,18 @@ def generate_comm_copy_attr_convert_fn(self):
396396
def generate_comm_delete_attr_convert_fn(self):
397397
self.generic_convert(ConvertFuncs.COMM_DELETE_ATTR_FUNCTION, 'comm_delete_attr_fn', 'MPI_Comm_delete_attr_function *', consts.RESERVED_COMM_DEL_ATTR_FNS)
398398

399+
def generate_type_copy_attr_convert_fn(self):
400+
self.generic_convert(ConvertFuncs.TYPE_COPY_ATTR_FUNCTION, 'type_copy_attr_fn', 'MPI_Type_copy_attr_function *', consts.RESERVED_TYPE_COPY_ATTR_FNS)
401+
402+
def generate_type_delete_attr_convert_fn(self):
403+
self.generic_convert(ConvertFuncs.TYPE_DELETE_ATTR_FUNCTION, 'type_delete_attr_fn', 'MPI_Type_delete_attr_function *', consts.RESERVED_TYPE_DEL_ATTR_FNS)
404+
405+
def generate_win_copy_attr_convert_fn(self):
406+
self.generic_convert(ConvertFuncs.WIN_COPY_ATTR_FUNCTION, 'win_copy_attr_fn', 'MPI_Win_copy_attr_function *', consts.RESERVED_WIN_COPY_ATTR_FNS)
407+
408+
def generate_win_delete_attr_convert_fn(self):
409+
self.generic_convert(ConvertFuncs.WIN_DELETE_ATTR_FUNCTION, 'win_delete_attr_fn', 'MPI_Win_delete_attr_function *', consts.RESERVED_WIN_DEL_ATTR_FNS)
410+
399411
def generate_group_convert_fn(self):
400412
self.generic_convert(ConvertFuncs.GROUP, 'group', 'MPI_Group', consts.RESERVED_GROUPS)
401413

@@ -545,11 +557,15 @@ def generate_status_convert_fn(self):
545557
self.dump(f'{consts.INLINE_ATTRS} void {ConvertFuncs.STATUS}({type_} *out, {abi_type} *inp)')
546558
self.dump('{')
547559
self.dump(' void *ptr = &out->_ucount;')
548-
self.dump(' out->MPI_SOURCE = inp->MPI_SOURCE;')
549-
self.dump(' out->MPI_TAG = inp->MPI_TAG;')
560+
self.dump(' if(inp->MPI_SOURCE == MPI_ANY_SOURCE_ABI_INTERNAL) {')
561+
self.dump(' out->MPI_SOURCE = MPI_ANY_SOURCE;')
562+
self.dump(' } else {')
563+
self.dump(' out->MPI_SOURCE = inp->MPI_SOURCE;')
564+
self.dump(' }')
565+
self.dump(f' out->MPI_TAG = {ConvertFuncs.TAG}(inp->MPI_TAG);')
550566
self.dump(' out->_cancelled = inp->MPI_internal[0];')
551567
self.dump(' memcpy(ptr, &inp->MPI_internal[1],sizeof(out->_ucount));')
552-
self.dump(f' out->MPI_ERROR = {ConvertFuncs.ERROR_CLASS}(inp->MPI_ERROR);')
568+
self.dump(f' out->MPI_ERROR = {ConvertFuncs.ERROR_CLASS}(inp->MPI_ERROR);')
553569
# Ignoring the private fields for now
554570
self.dump('}')
555571

@@ -559,11 +575,11 @@ def generate_status_convert_fn_intern_to_abi(self):
559575
self.dump(f'{consts.INLINE_ATTRS} void {ConvertOMPIToStandard.STATUS}({abi_type} *out, {type_} *inp)')
560576
self.dump('{')
561577
self.dump(' void *ptr = &out->MPI_internal[1];')
562-
self.dump(' out->MPI_SOURCE = inp->MPI_SOURCE;')
563-
self.dump(' out->MPI_TAG = inp->MPI_TAG;')
578+
self.dump(f' out->MPI_SOURCE = {ConvertOMPIToStandard.SOURCE}(inp->MPI_SOURCE);')
579+
self.dump(f' out->MPI_TAG = {ConvertOMPIToStandard.TAG}(inp->MPI_TAG);')
564580
self.dump(' out->MPI_internal[0] =inp->_cancelled;')
565581
self.dump(' memcpy(ptr, &inp->_ucount,sizeof(inp->_ucount));')
566-
# self.dump(f' out->MPI_ERROR = {ConvertOMPIToStandard.ERROR_CLASS}(inp->MPI_ERROR);')
582+
self.dump(f' out->MPI_ERROR = {ConvertOMPIToStandard.ERROR_CLASS}(inp->MPI_ERROR);')
567583
# Ignoring the private fields for now
568584
self.dump('}')
569585

@@ -594,7 +610,9 @@ def dump_code(self):
594610
self.dump('#define OMPI_ABI_HANDLE_BASE_OFFSET 16385')
595611
self.dump('\n')
596612

597-
# Now generate the conversion code
613+
# Now generate the conversion code - there's a reason for the order here
614+
# some converters depend on others being declared earlier in the include
615+
# file
598616
self.generate_error_convert_fn()
599617
self.generate_error_convert_fn_intern_to_abi()
600618
self.generate_comm_convert_fn()
@@ -621,12 +639,14 @@ def dump_code(self):
621639
self.generate_win_convert_fn_intern_to_abi()
622640
self.generate_request_convert_fn()
623641
self.generate_request_convert_fn_intern_to_abi()
642+
self.generate_tag_convert_fn()
643+
self.generate_tag_convert_fn_intern_to_abi()
644+
self.generate_source_convert_fn()
645+
self.generate_source_convert_fn_intern_to_abi()
624646
self.generate_status_convert_fn()
625647
self.generate_status_convert_fn_intern_to_abi()
626648
self.generate_attr_key_convert_fn()
627649
self.generate_attr_key_convert_fn_intern_to_abi()
628-
self.generate_tag_convert_fn()
629-
self.generate_tag_convert_fn_intern_to_abi()
630650
self.generate_ts_level_convert_fn()
631651
self.generate_ts_level_convert_fn_intern_to_abi()
632652
self.generate_pvar_session_convert_fn()
@@ -645,14 +665,16 @@ def dump_code(self):
645665
self.generate_t_source_order_convert_fn_intern_to_abi()
646666
self.generate_pvar_class_convert_fn()
647667
self.generate_pvar_class_convert_fn_intern_to_abi()
648-
self.generate_source_convert_fn()
649-
self.generate_source_convert_fn_intern_to_abi()
650668

651669
#
652670
# the following only need abi to intern converters
653671
#
654672
self.generate_comm_copy_attr_convert_fn()
655673
self.generate_comm_delete_attr_convert_fn()
674+
self.generate_type_copy_attr_convert_fn()
675+
self.generate_type_delete_attr_convert_fn()
676+
self.generate_win_copy_attr_convert_fn()
677+
self.generate_win_delete_attr_convert_fn()
656678
self.generate_comm_split_type_convert_fn()
657679
self.generate_weight_convert_fn()
658680

ompi/mpi/bindings/ompi_bindings/c_type.py

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ class Type(ABC):
2020

2121
def __init__(self, type_name, name=None,
2222
mangle_name=lambda name: util.abi_internal_name(name),
23-
count_param=None, **kwargs):
23+
count_param=None, outcount_param=None, **kwargs):
2424
self.type = type_name
2525
self.name = name
2626
self.count_param = count_param
27+
self.outcount_param = outcount_param
2728
self.mangle_name = mangle_name
2829

2930
@staticmethod
@@ -949,7 +950,7 @@ def final_code(self):
949950
code.append(f'{ConvertOMPIToStandard.STATUS}({self.name}, &{self.tmpname});')
950951
else:
951952
code.extend([
952-
'for (int i = 0; i < %s; ++i) {' % (self.count_param,),
953+
'for (int i = 0; i < %s; ++i) {' % (self.outcount_param,),
953954
f'{ConvertOMPIToStandard.STATUS}(&{self.name}[i], &{self.tmpname}[i]);',
954955
'}',
955956
f'free({self.tmpname});',
@@ -1242,17 +1243,21 @@ def type_text(self, enable_count=False):
12421243
class TypeMessageStandard(StandardABIType):
12431244

12441245
@property
1245-
def argument(self):
1246-
return f'(MPI_Message) {self.name}'
1246+
def init_code(self):
1247+
return [f'MPI_Comm {self.tmpname} = {ConvertFuncs.MESSAGE}({self.name});']
1248+
1249+
# @property
1250+
# def argument(self):
1251+
# return f'(MPI_Message) {self.name}'
12471252

12481253
def type_text(self, enable_count=False):
12491254
return self.mangle_name('MPI_Message')
12501255

12511256
def tmp_type_text(self, enable_count=False):
12521257
return 'MPI_Message'
12531258

1254-
def return_code(self, name):
1255-
return [f'return {ConvertOMPIToStandard.MESSAGE}({name});']
1259+
# def return_code(self, name):
1260+
# return [f'return {ConvertOMPIToStandard.MESSAGE}({name});']
12561261

12571262
@Type.add_type('MESSAGE_OUT', abi_type=['ompi'])
12581263
class TypeMessageOut(Type):
@@ -1262,7 +1267,11 @@ def type_text(self, enable_count=False):
12621267

12631268

12641269
@Type.add_type('MESSAGE_OUT', abi_type=['standard'])
1265-
class TypeMessageOutStandard(Type):
1270+
class TypeMessageOutStandard(StandardABIType):
1271+
1272+
@property
1273+
def final_code(self):
1274+
return [f'*{self.name} = {ConvertOMPIToStandard.MESSAGE}((MPI_Message) *{self.name});']
12661275

12671276
@property
12681277
def argument(self):
@@ -1272,6 +1281,33 @@ def type_text(self, enable_count=False):
12721281
type_name = self.mangle_name('MPI_Message')
12731282
return f'{type_name} *'
12741283

1284+
@Type.add_type('MESSAGE_INOUT', abi_type=['ompi'])
1285+
class TypeMessageInOut(Type):
1286+
1287+
def type_text(self, enable_count=False):
1288+
return 'MPI_Message *'
1289+
1290+
1291+
@Type.add_type('MESSAGE_INOUT', abi_type=['standard'])
1292+
class TypeMessageInOutStandard(StandardABIType):
1293+
1294+
@property
1295+
def init_code(self):
1296+
return [f'MPI_Message {self.tmpname} = {ConvertFuncs.MESSAGE}(*{self.name});']
1297+
1298+
@property
1299+
def final_code(self):
1300+
return [f'*{self.name} = {ConvertOMPIToStandard.MESSAGE}({self.tmpname});']
1301+
1302+
@property
1303+
def argument(self):
1304+
return f'&{self.tmpname}'
1305+
1306+
def type_text(self, enable_count=False):
1307+
type_name = self.mangle_name('MPI_Message')
1308+
return f'{type_name} *'
1309+
1310+
12751311
@Type.add_type('TS_LEVEL', abi_type=['ompi'])
12761312
class TypeTSLevel(Type):
12771313

@@ -1598,7 +1634,7 @@ def type_text(self, enable_count=False):
15981634
return 'MPI_Type_copy_attr_function *'
15991635

16001636
@Type.add_type('TYPE_COPY_ATTR_FUNCTION', abi_type=['standard'])
1601-
class TypeTypeCopyAttrFunctionStandard(Type):
1637+
class TypeTypeCopyAttrFunctionStandard(StandardABIType):
16021638

16031639
def type_text(self, enable_count=False):
16041640
type_name = self.mangle_name('MPI_Type_copy_attr_function')
@@ -1611,6 +1647,7 @@ def argument(self):
16111647
@property
16121648
def init_code(self):
16131649
code = []
1650+
code = [f'MPI_Type_copy_attr_function *{self.tmpname} = {ConvertFuncs.TYPE_COPY_ATTR_FUNCTION}({self.name});']
16141651
code = ['ompi_abi_wrapper_helper_t *helper = NULL;']
16151652
code.append('MPI_Type_copy_attr_function_ABI_INTERNAL *copy_fn;')
16161653
code.append('helper = ( ompi_abi_wrapper_helper_t *)malloc(sizeof(ompi_abi_wrapper_helper_t));')
@@ -1647,7 +1684,6 @@ def callback_wrapper_code(self):
16471684
code.append(' ompi_abi_wrapper_helper_t *helper = (ompi_abi_wrapper_helper_t *)extra_state;')
16481685
code.append(' MPI_Datatype_ABI_INTERNAL type_tmp = ompi_convert_datatype_ompi_to_standard(oldtype);')
16491686
code.append(' return helper->user_delete_fn((MPI_Datatype_ABI_INTERNAL)type_tmp, type_keyval, attribute_val, helper->user_extra_state);')
1650-
code.append(' free(helper);')
16511687
code.append('}')
16521688
return code
16531689

@@ -1659,15 +1695,15 @@ def type_text(self, enable_count=False):
16591695

16601696

16611697
@Type.add_type('TYPE_DELETE_ATTR_FUNCTION', abi_type=['standard'])
1662-
class TypeTypeDeleteAttrFunctionStandard(Type):
1698+
class TypeTypeDeleteAttrFunctionStandard(StandardABIType):
16631699

16641700
def type_text(self, enable_count=False):
16651701
type_name = self.mangle_name('MPI_Type_delete_attr_function')
16661702
return f'{type_name} *'
16671703

1668-
@property
1669-
def argument(self):
1670-
return f'(MPI_Type_delete_attr_function *) {self.name}'
1704+
# @property
1705+
# def argument(self):
1706+
# return f'(MPI_Type_delete_attr_function *) {self.name}'
16711707

16721708
#
16731709
# note the code generated here relies on that generated for
@@ -1676,6 +1712,7 @@ def argument(self):
16761712
@property
16771713
def init_code(self):
16781714
code = []
1715+
code = [f'MPI_Type_delete_attr_function *{self.tmpname} = {ConvertFuncs.TYPE_DELETE_ATTR_FUNCTION}({self.name});']
16791716
code.append('MPI_Type_delete_attr_function_ABI_INTERNAL *delete_fn;')
16801717
code.append(f'if ({self.name} == MPI_TYPE_NULL_DELETE_FN_ABI_INTERNAL)' + '{')
16811718
code.append('delete_fn = ABI_C_MPI_TYPE_NULL_DELETE_FN;')
@@ -1709,7 +1746,7 @@ def type_text(self, enable_count=False):
17091746

17101747

17111748
@Type.add_type('WIN_COPY_ATTR_FUNCTION', abi_type=['standard'])
1712-
class TypeWinCopyAttrFunctionStandard(Type):
1749+
class TypeWinCopyAttrFunctionStandard(StandardABIType):
17131750

17141751
def type_text(self, enable_count=False):
17151752
type_name = self.mangle_name('MPI_Win_copy_attr_function')
@@ -1770,7 +1807,7 @@ def type_text(self, enable_count=False):
17701807

17711808

17721809
@Type.add_type('WIN_DELETE_ATTR_FUNCTION', abi_type=['standard'])
1773-
class TypeWinDeleteAttrFunctionStandard(Type):
1810+
class TypeWinDeleteAttrFunctionStandard(StandardABIType):
17741811

17751812
def type_text(self, enable_count=False):
17761813
type_name = self.mangle_name('MPI_Win_delete_attr_function')

ompi/mpi/bindings/ompi_bindings/consts.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,24 @@
237237
'MPI_COMM_NULL_DELETE_FN'
238238
]
239239

240+
RESERVED_TYPE_COPY_ATTR_FNS = [
241+
'MPI_TYPE_NULL_COPY_FN',
242+
'MPI_TYPE_DUP_FN',
243+
]
244+
245+
RESERVED_TYPE_DEL_ATTR_FNS = [
246+
'MPI_TYPE_NULL_DELETE_FN'
247+
]
248+
249+
RESERVED_WIN_COPY_ATTR_FNS = [
250+
'MPI_WIN_NULL_COPY_FN',
251+
'MPI_WIN_DUP_FN',
252+
]
253+
254+
RESERVED_WIN_DEL_ATTR_FNS = [
255+
'MPI_WIN_NULL_DELETE_FN'
256+
]
257+
240258
IGNORED_STATUS_HANDLES = [
241259
'MPI_STATUSES_IGNORE',
242260
'MPI_STATUS_IGNORE',
@@ -459,6 +477,10 @@ class ConvertFuncs:
459477
ATTR_KEY = 'ompi_convert_abi_attr_key_intern_attr_key'
460478
COMM_COPY_ATTR_FUNCTION = 'ompi_convert_comm_copy_attr_fn_intern_comm_copy_attr_fn'
461479
COMM_DELETE_ATTR_FUNCTION = 'ompi_convert_comm_delete_attr_fn_intern_comm_delete_attr_fn'
480+
TYPE_COPY_ATTR_FUNCTION = 'ompi_convert_type_copy_attr_fn_intern_type_copy_attr_fn'
481+
TYPE_DELETE_ATTR_FUNCTION = 'ompi_convert_type_delete_attr_fn_intern_type_delete_attr_fn'
482+
WIN_COPY_ATTR_FUNCTION = 'ompi_convert_win_copy_attr_fn_intern_win_copy_attr_fn'
483+
WIN_DELETE_ATTR_FUNCTION = 'ompi_convert_win_delete_attr_fn_intern_win_delete_attr_fn'
462484
SPLIT_TYPE = 'ompi_convert_split_type_intern_type'
463485
WEIGHTS = 'ompi_convert_weight_intern_weight'
464486

ompi/mpi/bindings/ompi_bindings/parser.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,33 @@ class Parameter:
1616

1717
def __init__(self, text, type_constructor):
1818
"""Parse a parameter."""
19-
# parameter in the form "TYPE NAME" or "TYPE NAME:COUNT_VAR"
19+
# parameter in the form "TYPE NAME" or "TYPE NAME:COUNT_VAR" or "TYPE NAME:COUNT_VAR:OUTCOUNT_VAR"
20+
# some methods allocate more space for an array that what is needed in the final code, for example
21+
# with MPI_Waitsome, etc.
2022
try:
2123
type_name, namecount = text.split()
2224
except Exception as e:
2325
print(f"Error: could not split '{text}' got error {e}")
2426
sys.exit(-1)
2527
if ':' in namecount:
26-
name, count_param = namecount.split(':')
28+
if (namecount.count(':') == 2):
29+
name, count_param, outcount_param = namecount.split(':')
30+
else:
31+
name, count_param = namecount.split(':')
32+
outcount_param = count_param
2733
else:
28-
name, count_param = namecount, None
34+
name, count_param, outcount_param = namecount, None, None
2935
self.type_name = type_name
3036
self.name = name
3137
self.count_param = count_param
38+
self.outcount_param = outcount_param
3239
self.type_constructor = type_constructor
3340

3441
def construct(self, **kwargs):
3542
"""Construct the type parameter for the given ABI."""
3643
return self.type_constructor(type_name=self.type_name, name=self.name,
37-
count_param=self.count_param, **kwargs)
44+
count_param=self.count_param,
45+
outcount_param=self.outcount_param, **kwargs)
3846

3947

4048
class ReturnType:

ompi/mpi/c/imrecv.c.in

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "ompi/message/message.h"
2424

2525
PROTOTYPE ERROR_CLASS imrecv(BUFFER_OUT buf, COUNT count, DATATYPE type,
26-
MESSAGE_OUT message, REQUEST_INOUT request)
26+
MESSAGE_INOUT message, REQUEST_INOUT request)
2727
{
2828
int rc = MPI_SUCCESS;
2929
ompi_communicator_t *comm;
@@ -52,9 +52,8 @@ PROTOTYPE ERROR_CLASS imrecv(BUFFER_OUT buf, COUNT count, DATATYPE type,
5252
comm = (*message)->comm;
5353
}
5454

55-
if (&ompi_message_no_proc.message == *message) {
55+
if (MPI_MESSAGE_NO_PROC == *message) {
5656
*request = &ompi_request_empty;
57-
*message = MPI_MESSAGE_NULL;
5857
return MPI_SUCCESS;
5958
}
6059

ompi/mpi/c/mrecv.c.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include "ompi/runtime/ompi_spc.h"
2828

2929
PROTOTYPE ERROR_CLASS mrecv(BUFFER_OUT buf, COUNT count, DATATYPE type,
30-
MESSAGE_OUT message, STATUS_OUT status)
30+
MESSAGE_INOUT message, STATUS_OUT status)
3131
{
3232
int rc = MPI_SUCCESS;
3333
ompi_communicator_t *comm;

ompi/mpi/c/startall.c.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
#include "ompi/request/request.h"
3737
#include "ompi/memchecker.h"
3838

39-
PROTOTYPE ERROR_CLASS startall(INT count, REQUEST_INOUT requests)
39+
PROTOTYPE ERROR_CLASS startall(INT count, REQUEST_INOUT requests:count)
4040
{
4141
int i, j;
4242
int ret = OMPI_SUCCESS;

ompi/mpi/c/testall.c.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
#include "ompi/runtime/ompi_spc.h"
3737

3838
PROTOTYPE ERROR_CLASS testall(INT count, REQUEST_INOUT requests:count, INT_OUT flag,
39-
STATUS_OUT statuses)
39+
STATUS_OUT statuses:count)
4040
{
4141
SPC_RECORD(OMPI_SPC_TESTALL, 1);
4242

ompi/mpi/c/waitsome.c.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
PROTOTYPE ERROR_CLASS waitsome(INT incount, REQUEST_INOUT requests:incount,
4141
INT_OUT outcount, INT_OUT indices:incount,
42-
STATUS_OUT statuses:incount)
42+
STATUS_OUT statuses:incount:*outcount)
4343
{
4444
SPC_RECORD(OMPI_SPC_WAITSOME, 1);
4545

0 commit comments

Comments
 (0)