Skip to content

Commit e02ab87

Browse files
committed
First try.
1 parent 29c7c92 commit e02ab87

File tree

2 files changed

+149
-21
lines changed

2 files changed

+149
-21
lines changed

src/mpi/mpi_caf.c

Lines changed: 148 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -599,14 +599,26 @@ PREFIX (register) (size_t size, caf_register_t type, caf_token_t *token,
599599
mpi_token->desc = NULL;
600600

601601
#if MPI_VERSION >= 3
602-
if (type != CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY)
602+
if (type == CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY)
603603
{
604-
// Note, MPI_Win_allocate implicitly synchronizes.
605-
MPI_Win_allocate (actual_size, 1, MPI_INFO_NULL, CAF_COMM_WORLD, &mem, p);
604+
MPI_Win_create_dynamic (MPI_INFO_NULL, CAF_COMM_WORLD, p);
605+
fprintf(stderr, "%d/%d: Register win = %p\n", caf_this_image, caf_num_images,
606+
*p);
607+
// CAF_Win_lock_all (*p);
608+
}
609+
else if (type == CAF_REGTYPE_COARRAY_ALLOC_ALLOCATE_ONLY)
610+
{
611+
mem = malloc (actual_size);
612+
MPI_Win_attach (*p, mem, actual_size);
613+
fprintf(stderr, "%d/%d: Attach mem to win = %p\n", caf_this_image, caf_num_images,
614+
*p);
606615
CAF_Win_lock_all (*p);
607616
}
608617
else
609-
mem = NULL;
618+
{
619+
MPI_Win_allocate (actual_size, 1, MPI_INFO_NULL, CAF_COMM_WORLD, &mem, p);
620+
CAF_Win_lock_all (*p);
621+
}
610622
#else // MPI_VERSION
611623
MPI_Alloc_mem(actual_size, MPI_INFO_NULL, &mem);
612624
MPI_Win_create(mem, actual_size, 1, MPI_INFO_NULL, CAF_COMM_WORLD, p);
@@ -825,19 +837,22 @@ PREFIX (deregister) (caf_token_t *token, int *stat, char *errmsg, int errmsg_len
825837
p = TOKEN(*token);
826838
CAF_Win_unlock_all(*p);
827839
#ifdef GCC_GE_7
828-
mpi_caf_token_t *mpi_token = *(mpi_caf_token_t **)token;
829-
if (mpi_token->local_memptr)
830-
{
831-
MPI_Win_free(p);
832-
mpi_token->local_memptr = NULL;
833-
}
834-
if ((*(mpi_caf_token_t **)token)->desc
835-
&& type != CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY)
836-
{
837-
CAF_Win_unlock_all(*(mpi_token->desc));
838-
MPI_Win_free (mpi_token->desc);
839-
free (mpi_token->desc);
840-
}
840+
mpi_caf_token_t *mpi_token = *(mpi_caf_token_t **)token;
841+
if (mpi_token->local_memptr)
842+
{
843+
if (type != CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY)
844+
MPI_Win_free (p);
845+
else
846+
MPI_Win_detach (*p, mpi_token->local_memptr);
847+
mpi_token->local_memptr = NULL;
848+
}
849+
if ((*(mpi_caf_token_t **)token)->desc
850+
&& type != CAF_DEREGTYPE_COARRAY_DEALLOCATE_ONLY)
851+
{
852+
CAF_Win_unlock_all(*(mpi_token->desc));
853+
MPI_Win_free (mpi_token->desc);
854+
free (mpi_token->desc);
855+
}
841856
#else
842857
MPI_Win_free(p);
843858
#endif
@@ -2968,12 +2983,125 @@ PREFIX(sendget_by_ref) (caf_token_t dst_token, int dst_image_index,
29682983
error_stop (1);
29692984
}
29702985

2971-
29722986
int
29732987
PREFIX(is_present) (caf_token_t token, int image_index, caf_reference_t *refs)
29742988
{
2975-
fprintf (stderr, "COARRAY ERROR: caf_is_present() not implemented yet ");
2976-
error_stop (1);
2989+
const char unsupportedRefType[] = "Unsupported ref-type in caf_is_present().";
2990+
MPI_Errhandler oldErr;
2991+
mpi_caf_token_t *mpi_token = (mpi_caf_token_t *)token;
2992+
size_t i;
2993+
ptrdiff_t offset = 0;
2994+
void *local_memptr = mpi_token->local_memptr;
2995+
gfc_descriptor_t *src;
2996+
gfc_max_dim_descriptor_t src_desc_data, primary_src_desc_data;
2997+
caf_reference_t *riter = refs;
2998+
enum { COMP_REF, ARR_REF } last_ref;
2999+
3000+
GET_REMOTE_DESC (mpi_token, src, primary_src_desc_data, image_index - 1);
3001+
while (riter)
3002+
{
3003+
switch (riter->type)
3004+
{
3005+
case CAF_REF_COMPONENT:
3006+
if (riter->u.c.caf_token_offset)
3007+
{
3008+
mpi_token = *(mpi_caf_token_t**)
3009+
(local_memptr + riter->u.c.caf_token_offset);
3010+
local_memptr = mpi_token->local_memptr;
3011+
GET_REMOTE_DESC (mpi_token, src, src_desc_data, image_index - 1);
3012+
offset = 0;
3013+
}
3014+
else
3015+
{
3016+
local_memptr += riter->u.c.offset;
3017+
src = (gfc_descriptor_t *)local_memptr;
3018+
offset += riter->u.c.offset;
3019+
}
3020+
last_ref = COMP_REF;
3021+
break;
3022+
case CAF_REF_ARRAY:
3023+
for (i = 0; riter->u.a.mode[i] != CAF_ARR_REF_NONE; ++i)
3024+
{
3025+
switch (riter->u.a.mode[i])
3026+
{
3027+
case CAF_ARR_REF_FULL:
3028+
/* The memptr stays unchanged when ref'ing the first element
3029+
in a dimension. */
3030+
break;
3031+
case CAF_ARR_REF_SINGLE:
3032+
local_memptr += (riter->u.a.dim[i].s.start
3033+
- src->dim[i].lower_bound)
3034+
* src->dim[i]._stride
3035+
* riter->item_size;
3036+
break;
3037+
case CAF_ARR_REF_VECTOR:
3038+
case CAF_ARR_REF_RANGE:
3039+
case CAF_ARR_REF_OPEN_END:
3040+
case CAF_ARR_REF_OPEN_START:
3041+
/* Intentionally fall through, because these are not suported
3042+
* here. */
3043+
default:
3044+
caf_runtime_error (unsupportedRefType, NULL, NULL, 0);
3045+
return false;
3046+
}
3047+
}
3048+
last_ref = ARR_REF;
3049+
break;
3050+
case CAF_REF_STATIC_ARRAY:
3051+
for (i = 0; riter->u.a.mode[i] != CAF_ARR_REF_NONE; ++i)
3052+
{
3053+
switch (riter->u.a.mode[i])
3054+
{
3055+
case CAF_ARR_REF_FULL:
3056+
/* The memptr stays unchanged when ref'ing the first element
3057+
in a dimension. */
3058+
break;
3059+
case CAF_ARR_REF_SINGLE:
3060+
local_memptr += riter->u.a.dim[i].s.start
3061+
* riter->u.a.dim[i].s.stride
3062+
* riter->item_size;
3063+
break;
3064+
case CAF_ARR_REF_VECTOR:
3065+
case CAF_ARR_REF_RANGE:
3066+
case CAF_ARR_REF_OPEN_END:
3067+
case CAF_ARR_REF_OPEN_START:
3068+
default:
3069+
caf_runtime_error (unsupportedRefType, NULL, NULL, 0);
3070+
return false;
3071+
}
3072+
}
3073+
last_ref = COMP_REF;
3074+
break;
3075+
default:
3076+
caf_runtime_error (unsupportedRefType, NULL, NULL, 0);
3077+
return false;
3078+
}
3079+
riter = riter->next;
3080+
}
3081+
3082+
if (last_ref == COMP_REF)
3083+
{
3084+
MPI_Win win = *TOKEN (mpi_token);
3085+
char dummy;
3086+
char errmsg[200];
3087+
int ierr, len;
3088+
len = 200;
3089+
3090+
MPI_Win_get_errhandler (win, &oldErr);
3091+
MPI_Win_set_errhandler (win, MPI_ERRORS_RETURN);
3092+
3093+
ierr = MPI_Get (&dummy, 1, MPI_BYTE, image_index - 1, offset, 1, MPI_BYTE,
3094+
win);
3095+
MPI_Error_string(ierr, errmsg, &len);
3096+
fprintf(stderr, "%d/%d: caf_is_present(): offset = %d, ierr =%d, %s\n", caf_this_image,
3097+
caf_num_images, offset, ierr, errmsg);
3098+
MPI_Win_set_errhandler (win, oldErr);
3099+
return ierr == MPI_SUCCESS;
3100+
}
3101+
else
3102+
{
3103+
return src->base_addr != NULL;
3104+
}
29773105
}
29783106
#endif
29793107

src/tests/unit/init_register/async_comp_alloc.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ program async_comp_alloc
6464

6565
block
6666
integer :: allocating_image, test_image
67-
character(len=8) :: image_number
67+
character(len=20) :: image_number
6868

6969
loop_over_all_image_numbers: do allocating_image = 1, np
7070
!! Check that all allocations have been performed up to allocating_image and

0 commit comments

Comments
 (0)