Skip to content

Commit fe73a9b

Browse files
committed
test
1 parent c52fb80 commit fe73a9b

File tree

5 files changed

+240
-31
lines changed

5 files changed

+240
-31
lines changed

docs/source/core_concepts.rst

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -174,19 +174,22 @@ provide a mapping between in-memory data and the logical layout of objects, enab
174174
fine-grained control over data placement. Multiple regions may be
175175
transferred at once to support batch operations.
176176

177-
Data Transfer Modes
177+
Consistency Options
178178
~~~~~~~~~~~~~~~~~~~
179179

180-
Data can be exchanged between memory and storage using either asynchronous or
181-
synchronous I/O.
180+
Data can be exchanged between memory and storage using different consistency models,
181+
such as synchronous (POSIX) or asynchronous (eventual) I/O.
182+
Applications can choose or even dynamically adjust the consistency mode depending on their
183+
specific requirements-favoring strict consistency when immediate visibility of updates is critical,
184+
or opting for eventual consistency to improve performance and overlap computation with data movement
185+
in parallel or distributed workflows.
182186

183-
- **Asynchronous Transfers**
184-
Allow computation and communication to overlap by decoupling data movement from
185-
execution flow.
187+
- **POSIX Consistency**
188+
Synchronous reads and writes are enforced.
189+
All operations are immediately visible to all processes, ensuring strict consistency.
186190

187-
- **Synchronous Transfers**
188-
Complete data movement before proceeding,
189-
simplifying coordination in sequential workflows.
191+
- **Eventual Consistency**
192+
Updates are performed asynchronously. Reads may return stale data until updates propagate, allowing computation and communication to overlap and improving performance in parallel workflows.
190193

191194
Finalization
192195
~~~~~~~~~~~~

docs/source/introduction.rst

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -656,21 +656,31 @@ PDCpy First Program
656656
import numpy as np
657657
658658
def main():
659-
cont = pdc.Container()
660-
prop = Object.Properties(
661-
64,
662-
pdc.Type.DOUBLE,
659+
cont = pdc.Container('my_container', lifetime=pdc.Container.Lifetime.TRANSIENT)
660+
661+
prop = pdc.Object.Properties(
662+
dims=(64,),
663+
type=pdc.Type.DOUBLE,
663664
)
665+
664666
obj = cont.create_object("my_object", prop)
665-
data = np.fromiter(np.double, 64)
666-
obj.set_data(data)
667-
668-
It begins by creating a PDC container and defining object properties such as size
669-
and data type (lines 6-9). An object is then created within the container using
670-
these properties (line 10). A NumPy array of 64 double-precision values is prepared
671-
to serve as the data buffer (line 11). The data is written to the PDC object using
672-
the set_data() method (line 12), which handles the region creation and data transfer
673-
internally.
667+
668+
data = np.arange(64, dtype=np.double)
669+
obj.set_data(data).wait()
670+
671+
all_data = obj.get_data().wait()
672+
print(all_data)
673+
674+
if __name__ == "__main__":
675+
main()
676+
677+
It begins by creating a PDC container with a specified name and lifetime (line 6).
678+
Object properties, including the number of elements and data type, are then defined
679+
using pdc.Object.Properties (lines 8-11). A PDC object is created within the container
680+
using these properties (line 13). A NumPy array of 64 double-precision values is prepared
681+
as the data buffer (line 15). The data is written to the PDC object using the set_data()
682+
method (line 16), and .wait() ensures that the transfer is completed. Finally, the stored
683+
data is retrieved using get_data() and printed (lines 18-19).
674684

675685
.. _vol-pdc-first-program:
676686

docs/source/roadmap.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ vision for PDC.
1010
**7.2.** Current Focus (Ongoing)
1111
--------------------------------
1212

13-
- **Stability and Performance**
14-
- Continue improving metadata and data transfer scalability across large-scale HPC systems.
15-
- Optimize communication via Mercury and MPI layers.
16-
- Enhance fault tolerance and recovery mechanisms for PDC servers.
13+
- **Transformations**
14+
- Research is currently focused on enabling flexible and efficient in-flight data transformations within PDC.
15+
The goal is to allow data to be transformed transparently during movement between storage and memory, reducing
16+
application complexity and improving performance. Efforts include defining abstractions for expressing transformation pipelines,
17+
integrating them with I/O operations, and exploring strategies to optimize execution without requiring
18+
manual intervention from application developers.
1719

1820
- **User Experience**
1921
- Streamline configuration with clearer environment variables and default parameters.

docs/source/using_pdc.rst

Lines changed: 195 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ Complete Examples
2525
- :ref:`Example: 2D Region Transfers <2D-region-transfer>`
2626
- :ref:`Example: 2D Batch Region Transfer <2D-batch-region-transfer>`
2727
- :ref:`Example: Get & Put Object <get-put-object>`
28-
28+
- :ref:`Example: Add & Get KV Tag: <add-get-kvtag>`
29+
- :ref:`Example: Querying Object Data: <querying-object-data>`
2930
**3.2.** Initializing PDC
3031
-------------------------
3132

@@ -229,6 +230,7 @@ For scenarios involving many objects or regions, PDC supports batch transfers to
229230
~~~~~~~~~~~~~~~~~~~~~~~~~~
230231

231232
.. code-block:: C
233+
:linenos:
232234
233235
#include <stdio.h>
234236
#include "pdc.h"
@@ -343,6 +345,7 @@ For scenarios involving many objects or regions, PDC supports batch transfers to
343345
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
344346

345347
.. code-block:: C
348+
:linenos:
346349
347350
#include <stdio.h>
348351
#include "pdc.h"
@@ -479,6 +482,7 @@ Get Put Object Example
479482
~~~~~~~~~~~~~~~~~~~~~~
480483

481484
.. code-block:: C
485+
:linenos:
482486
483487
#include <stdio.h>
484488
#include <stdlib.h>
@@ -571,3 +575,193 @@ Get Put Object Example
571575
572576
return ret_value;
573577
}
578+
579+
.. _add-get-kvtag:
580+
581+
Add Get KV Tag
582+
~~~~~~~~~~~~~~
583+
584+
.. code-block:: C
585+
:linenos:
586+
587+
#include <stdio.h>
588+
#include <stdlib.h>
589+
#include <string.h>
590+
#include "pdc.h"
591+
592+
int main() {
593+
pdcid_t pdc, cont_prop, cont, obj_prop1, obj_prop2, obj1, obj2;
594+
pdc_kvtag_t kvtag1, kvtag2, kvtag3;
595+
char *v1 = "value1";
596+
int v2 = 2;
597+
double v3 = 3.45;
598+
pdc_var_type_t type1, type2, type3;
599+
void *value1, *value2, *value3;
600+
psize_t value_size;
601+
602+
// create a pdc
603+
pdc = PDCinit("pdc");
604+
605+
// create container property and container
606+
cont_prop = PDCprop_create(PDC_CONT_CREATE, pdc);
607+
cont = PDCcont_create("c1", cont_prop);
608+
609+
// create object properties
610+
obj_prop1 = PDCprop_create(PDC_OBJ_CREATE, pdc);
611+
obj_prop2 = PDCprop_create(PDC_OBJ_CREATE, pdc);
612+
613+
// create objects
614+
obj1 = PDCobj_create(cont, "o1", obj_prop1);
615+
obj2 = PDCobj_create(cont, "o2", obj_prop2);
616+
617+
// define key-value tags
618+
kvtag1.name = "key1string";
619+
kvtag1.value = (void *)v1;
620+
kvtag1.type = PDC_STRING;
621+
kvtag1.size = strlen(v1) + 1;
622+
623+
kvtag2.name = "key2int";
624+
kvtag2.value = (void *)&v2;
625+
kvtag2.type = PDC_INT;
626+
kvtag2.size = sizeof(int);
627+
628+
kvtag3.name = "key3double";
629+
kvtag3.value = (void *)&v3;
630+
kvtag3.type = PDC_DOUBLE;
631+
kvtag3.size = sizeof(double);
632+
633+
// put tags for obj1
634+
PDCobj_put_tag(obj1, kvtag1.name, kvtag1.value, kvtag1.type, kvtag1.size);
635+
PDCobj_put_tag(obj1, kvtag2.name, kvtag2.value, kvtag2.type, kvtag2.size);
636+
637+
// put tag for obj2
638+
PDCobj_put_tag(obj2, kvtag3.name, kvtag3.value, kvtag3.type, kvtag3.size);
639+
640+
// get tags
641+
PDCobj_get_tag(obj1, kvtag1.name, (void *)&value1, (void *)&type1, (void *)&value_size);
642+
PDCobj_get_tag(obj2, kvtag1.name, (void *)&value2, (void *)&type2, (void *)&value_size);
643+
PDCobj_get_tag(obj2, kvtag3.name, (void *)&value3, (void *)&type3, (void *)&value_size);
644+
645+
// delete and put new tag for obj1
646+
PDCobj_del_tag(obj1, kvtag1.name);
647+
v1 = "New Value After Delete";
648+
kvtag1.value = (void *)v1;
649+
kvtag1.size = strlen(v1) + 1;
650+
PDCobj_put_tag(obj1, kvtag1.name, kvtag1.value, kvtag1.type, kvtag1.size);
651+
PDCobj_get_tag(obj1, kvtag1.name, (void *)&value1, (void *)&type1, (void *)&value_size);
652+
653+
// close objects, container, properties, and pdc
654+
PDCobj_close(obj1);
655+
PDCobj_close(obj2);
656+
PDCcont_close(cont);
657+
PDCprop_close(obj_prop1);
658+
PDCprop_close(obj_prop2);
659+
PDCprop_close(cont_prop);
660+
PDCclose(pdc);
661+
662+
return 0;
663+
}
664+
665+
.. _querying-object-data:
666+
667+
Querying Object Data
668+
~~~~~~~~~~~~~~~~~~~~
669+
670+
.. code-block:: C
671+
672+
#include <stdio.h>
673+
#include <stdlib.h>
674+
#include <string.h>
675+
#include <unistd.h>
676+
#include "pdc.h"
677+
678+
int main(int argc, char **argv) {
679+
int rank = 0, size = 1;
680+
uint64_t size_MB;
681+
pdcid_t obj_id = -1;
682+
struct pdc_region_info region;
683+
uint64_t i, dims[1];
684+
pdc_selection_t sel;
685+
char *obj_name;
686+
int my_data_count;
687+
pdc_metadata_t *metadata;
688+
pdcid_t pdc, cont_prop, cont, obj_prop;
689+
int ndim = 1;
690+
int *mydata;
691+
692+
#ifdef ENABLE_MPI
693+
MPI_Init(&argc, &argv);
694+
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
695+
MPI_Comm_size(MPI_COMM_WORLD, &size);
696+
#endif
697+
698+
if (argc < 3)
699+
return 1;
700+
701+
obj_name = argv[1];
702+
size_MB = atoi(argv[2]) * 1048576; // convert MB to bytes
703+
704+
// create a PDC
705+
pdc = PDCinit("pdc");
706+
707+
// create container property and container
708+
cont_prop = PDCprop_create(PDC_CONT_CREATE, pdc);
709+
cont = PDCcont_create("c1", cont_prop);
710+
711+
// create object property
712+
obj_prop = PDCprop_create(PDC_OBJ_CREATE, pdc);
713+
714+
my_data_count = size_MB / size;
715+
dims[0] = my_data_count;
716+
PDCprop_set_obj_dims(obj_prop, 1, dims);
717+
PDCprop_set_obj_user_id(obj_prop, getuid());
718+
PDCprop_set_obj_time_step(obj_prop, 0);
719+
PDCprop_set_obj_app_name(obj_prop, "DataServerTest");
720+
PDCprop_set_obj_tags(obj_prop, "tag0=1");
721+
PDCprop_set_obj_type(obj_prop, PDC_INT);
722+
723+
// create object (only rank 0)
724+
if (rank == 0)
725+
obj_id = PDCobj_create(cont, obj_name, obj_prop);
726+
727+
#ifdef ENABLE_MPI
728+
MPI_Barrier(MPI_COMM_WORLD);
729+
#endif
730+
731+
region.ndim = ndim;
732+
region.offset = (uint64_t *)malloc(sizeof(uint64_t) * ndim);
733+
region.size = (uint64_t *)malloc(sizeof(uint64_t) * ndim);
734+
region.offset[0] = rank * my_data_count;
735+
region.size[0] = my_data_count;
736+
737+
mydata = (int *)malloc(my_data_count);
738+
for (i = 0; i < my_data_count / sizeof(int); i++)
739+
mydata[i] = i + rank * 1000;
740+
741+
PDC_Client_write(metadata, &region, mydata);
742+
743+
// construct a simple query example
744+
int lo0 = 1000;
745+
pdc_query_t *q0 = PDCquery_create(obj_id, PDC_LT, PDC_INT, &lo0);
746+
PDCquery_sel_region(q0, &region);
747+
748+
PDCquery_get_selection(q0, &sel);
749+
PDCselection_print(&sel);
750+
751+
// free resources
752+
PDCquery_free_all(q0);
753+
PDCregion_free(&region);
754+
PDCselection_free(&sel);
755+
free(mydata);
756+
757+
PDCcont_close(cont);
758+
PDCprop_close(cont_prop);
759+
PDCprop_close(obj_prop);
760+
PDCclose(pdc);
761+
762+
#ifdef ENABLE_MPI
763+
MPI_Finalize();
764+
#endif
765+
766+
return 0;
767+
}

src/tests/query/query_data.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ main(int argc, char **argv)
2424
struct pdc_region_info region;
2525
uint64_t i, dims[1];
2626
pdc_selection_t sel;
27-
char * obj_name;
27+
char *obj_name;
2828
int my_data_count;
29-
pdc_metadata_t * metadata;
29+
pdc_metadata_t *metadata;
3030
pdcid_t pdc, cont_prop, cont, obj_prop;
3131
int ndim = 1;
32-
int * mydata;
32+
int *mydata;
3333
int lo0 = 1000;
3434
int lo1 = 2000, hi1 = 3000;
3535
int lo2 = 5000, hi2 = 7000;
36-
pdc_query_t * q0, *q1l, *q1h, *q1, *q2l, *q2h, *q2, *q, *q12;
36+
pdc_query_t *q0, *q1l, *q1h, *q1, *q2l, *q2h, *q2, *q, *q12;
3737
int ret_value = 0;
3838

3939
struct timeval ht_total_start;

0 commit comments

Comments
 (0)