diff --git a/maestro/cdo.c b/maestro/cdo.c index 4093b7aef907b52c6c621faa8795347f53e5a8b4..4290ce4505463bc362bd349d41affe3b76897c92 100644 --- a/maestro/cdo.c +++ b/maestro/cdo.c @@ -488,7 +488,16 @@ mstro_cdo__create_mamba_array(mstro_cdo cdo) ERR("Couldn't create a Mamba layout\n"); return MSTRO_FAIL; } + if (cdo->raw_ptr != NULL) { + me = mmb_array_create_wrapped( + cdo->raw_ptr, + &dims, + layout, + g_default_cdo_interface, + MMB_READ_WRITE, &(cdo->mamba_array)); + } else { me = mmb_array_create(&dims, layout, g_default_cdo_interface, MMB_READ_WRITE, & (cdo->mamba_array)); + } if (me != MMB_OK) { ERR("Couldn't create a Mamba array\n"); return MSTRO_FAIL; @@ -1293,12 +1302,6 @@ mstro_cdo__satisfy(mstro_cdo src, mstro_cdo dst) return s; } - s = mstro_cdo__mamba_copy(src, dst); - if(s!=MSTRO_OK) { - ERR("Failed to perform mamba copy\n"); - return s; - } - /* FIXME: once mamba_copy takes into account layout properties we need to adjust dst->attributes to avoid doing transformations twice when we do the transform below */ } @@ -1306,7 +1309,6 @@ mstro_cdo__satisfy(mstro_cdo src, mstro_cdo dst) size_t num_precious_attr = 0; const char **precious_attributes = NULL; - /* data is now identical */ s = mstro_transform_layout(src, dst, src->attributes, dst->attributes); /* FIXME: precious attr should be a return value of transform_layout */ @@ -1315,6 +1317,13 @@ mstro_cdo__satisfy(mstro_cdo src, mstro_cdo dst) if(s==MSTRO_NOMATCH) { /* no applicable transformation */ DEBUG("No transformation applied\n"); + + s = mstro_cdo__mamba_copy(src, dst); + if(s!=MSTRO_OK) { + ERR("Failed to perform mamba copy\n"); + return s; + } + } else { ERR("Failure trying to apply a transformation\n"); return s; @@ -1813,7 +1822,7 @@ mstro_cdo_allocate_data(mstro_cdo cdo) cdo->name); return MSTRO_FAIL; } - + s = mstro_cdo__create_mamba_array(cdo); if(s!=MSTRO_OK) { ERR("Failed to create mmbArray wrapper for raw-ptr\n"); diff --git a/tests/check_layout.c b/tests/check_layout.c index 1f97bf7d809c34563c7f5c74dc699e0484a4210a..18caa7ab8309677453983c9a9c55f81988cefaf6 100644 --- a/tests/check_layout.c +++ b/tests/check_layout.c @@ -55,6 +55,19 @@ #define COLMAJ MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER_COLMAJOR CHEAT_DECLARE ( + void + print_mat(double* p) + { + size_t i,j; + for (i=0; i<N; i++) { + for (j=0; j<M; j++) + fprintf(stderr, "%2.0f ", p[i*M+j]); + fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + + } + unsigned long mamba_data_diff(mmbArray* src, mmbArray* dst) { @@ -69,8 +82,10 @@ CHEAT_DECLARE ( p_dst = dst->allocation->ptr; for (i=0,x=0;i<n; i++) x += ((unsigned char*)p_src)[i] ^ ((unsigned char*)p_dst)[i]; + return x; } + ) CHEAT_TEST(layout_attribute_works, @@ -78,10 +93,13 @@ CHEAT_TEST(layout_attribute_works, int64_t bytes = data_count*sizeof(double); double* src_data = malloc(bytes); double* unpooled_data = malloc(bytes); + double* unpooled_data_t = malloc(bytes); + + srandom(time(NULL)); for(size_t i=0; i<data_count; i++) { - src_data[i]=random(); + src_data[i]=random()%100; } - + cheat_assert(MSTRO_OK == mstro_init("Tests","LAYOUT",0)); char name[] = "transformation_pioneer"; char name_unpooled[] = "unpooled"; @@ -140,7 +158,7 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst, MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_dst)); - cheat_assert(MSTRO_OK == mstro_cdo_require(cdo_dst)); + cheat_assert(MSTRO_OK == mstro_cdo_require(cdo_dst)); cheat_assert(MSTRO_OK == mstro_cdo_demand(cdo_dst)); /* at this point automatic transformation was performed */ @@ -169,7 +187,8 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_transform_layout(cdo_src, cdo_unpooled, cdo_src->attributes, cdo_unpooled->attributes)); /* checksum pool and non-pool results */ - mmbArray* m_dst, *m_unpooled; + mmbArray *m_unpooled; + mmbArray* m_dst; cheat_assert(MSTRO_OK == mstro_cdo_access_mamba_array(cdo_dst, &m_dst)); cheat_assert(MSTRO_OK == mstro_cdo_access_mamba_array(cdo_unpooled, &m_unpooled)); cheat_assert(0 == mamba_data_diff(m_dst, m_unpooled)); @@ -185,7 +204,7 @@ CHEAT_TEST(layout_attribute_works, (void**)&bytes)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, MSTRO_ATTR_CORE_CDO_RAW_PTR, - unpooled_data)); + unpooled_data_t)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, @@ -198,7 +217,8 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_transform_layout(cdo_unpooled, cdo_unpooled_t, cdo_unpooled->attributes, cdo_unpooled_t->attributes)); - mmbArray* m_src, *m_unpooled_t; + mmbArray *m_unpooled_t; + mmbArray* m_src; cheat_assert(MSTRO_OK == mstro_cdo_access_mamba_array(cdo_src, &m_src)); cheat_assert(MSTRO_OK == mstro_cdo_access_mamba_array(cdo_unpooled_t, &m_unpooled_t)); cheat_assert(0 == mamba_data_diff(m_src, m_unpooled_t)); @@ -209,6 +229,10 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_finalize()); + free(unpooled_data_t); + free(unpooled_data); + free(src_data); + ) diff --git a/transformation/transformation.c b/transformation/transformation.c index fe99469de9d3464a72c23f777d96429ee5eecd1d..8f1516fd18d6a702727f639dced68ace0c5b6ca2 100644 --- a/transformation/transformation.c +++ b/transformation/transformation.c @@ -222,7 +222,7 @@ mstro_transform_transpose( for (k=0; k<eltsize; k++) dst_ptr[i*dst_d0*eltsize + j*eltsize +k] = src_ptr[j*dst_d1*eltsize + i*eltsize+k]; - + } return MSTRO_OK;