Προς το περιεχόμενο

Function pointer serialization σε C


gon1332

Προτεινόμενες αναρτήσεις

Δεν γίνεται να κατασκευάσεις κώδικα στο runtime μέσα στο ίδιο process (τα bytes που στέλνεις και λαμβάνεις δεν βρίσκονται σε εκτελέσιμη περιοχή μνήμης)

 

Γιατί δε γίνεται;

 

Ζητάς μνήμη από το λειτουργικό με execute flag, γράφεις ό,τι θέλεις εκει μέσα και δώστου -- ανάλογα τι έκανες π.χ. μπορείς να μεταφέρεις τη ροή εκεί με λίγη inline assembly ή να φτιάξεις ένα function pointer και να τον καλέσεις ή άλλες παραλλαγές στο σενάριο.

 

Εφόσον έκανα fork, τότε και οι νέες διεργασίες έχω copy του text segment, οπότε και οι function pointers είναι έγκυροι αν τους μεταφέρω σε άλλη διεργασία. Όλα κομπλέ.

 

Καλή φάση αλλά....

 

Τα messages θα έχουν μόνο data. Τίποτα άλλο.

Ο κάθε worker θα πρέπει να ξέρει ποια συνάρτηση "επεξεργασίας" να καλέσει για το κάθε task απο τα data και μόνο.

(πχ ένα defined κατα το compile time, map με συμβολική τιμή (enumerator φάση) και τη συνάρτηση που επεξεργάζεται αυτό τον τύπο task. Και κάθε task να έχει ένα taskType μεταβλητή ας πούμε απο αυτό το enumerator.)

 

Αυτό είναι τόσο προφανές που να πω την αλήθεια I was shocked ότι ξεκίνησες εξαρχής προς άλλη κατεύθυνση. Έτσι κι αλλιώς δηλαδή την κάνεις αυτή τη δουλειά κάπου προκειμένου να δώσεις τιμή στο fp, επόμενη σκέψη είναι την κάνει ο worker και αυτομάτως γλυτώνεις όλα τα σχετικά προβλήματα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλή φάση αλλά....

 

 

Αυτό είναι τόσο προφανές που να πω την αλήθεια I was shocked ότι ξεκίνησες εξαρχής προς άλλη κατεύθυνση. Έτσι κι αλλιώς δηλαδή την κάνεις αυτή τη δουλειά κάπου προκειμένου να δώσεις τιμή στο fp, επόμενη σκέψη είναι την κάνει ο worker και αυτομάτως γλυτώνεις όλα τα σχετικά προβλήματα.

Τα διάφορα tasks μπορεί να έχουν και dependencies μεταξύ τους. Ο coordinator θα τα δρομολογίσει ανάλογα στους workers.

 

Αυτό που είπε ο παπί θέλω. Τα μηνύματα θα περιέχουν user defined συναρτήσεις (δε θα είναι κάτι στάνταρ δηλαδή αναλόγως τα data) + τα data, τα οποία είναι οι παράμετροι των συναρτήσεων. Δεν κάνω δηλαδή RPC.

 

Οι workers θα εκτελούν τις συνάρτησεις που καθορίζει ο χρήστης. Δεν έχουν στάνταρ/καρφωτή συμπεριφορά δηλαδή.

 

@παπι

Τι εννοείς με τον python interpreter;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εννοω να τον κανεις embed. Πχ αν ο user θελει να εκτυπωσει τα δεδομενα του, στο user define code θα βαλει print(mydata) και εσυ με το αναλογο bind, θα τα εκτυπωνεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εννοω να τον κανεις embed. Πχ αν ο user θελει να εκτυπωσει τα δεδομενα του, στο user define code θα βαλει print(mydata) και εσυ με το αναλογο bind, θα τα εκτυπωνεις.

Πραγματικά δεν καταλαβαίνω τι θέλεις να πεις. :/ Έχεις κάποια πηγή να με κατευθύνει;

 

OK, λες να βάλω embedded Python στον κώδικά μου. Αυτός με ποια λογική; Να στείλω remote objects;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατί δε γίνεται;

 

Ζητάς μνήμη από το λειτουργικό με execute flag, γράφεις ό,τι θέλεις εκει μέσα και δώστου -- ανάλογα τι έκανες π.χ. μπορείς να μεταφέρεις τη ροή εκεί με λίγη inline assembly ή να φτιάξεις ένα function pointer και να τον καλέσεις ή άλλες παραλλαγές στο σενάριο.

 

Εγω εννουσα πως την μνημη που μεταφερει δεν μπορει να την εκτελεσει ετσι οπως ειναι, γιατι δεν ειναι ειναι εκτελεσιμη μνημη. Ειχα δοκιμασει κατι παρομοιο με αυτο που λες (mmap με PROT_EXEC flag και μεταφορα του PC register με inline asm ωστε να δειχνει στην θεση απο την οποια ξεκινανε τα instructions μου στο runtime) αλλα επαιρνα διαρκως SIGILL. Δεν ξερω μπορει να εκανα και κατι λαθος. Εκτός αν εννοεις κατι διαφορετικο και δεν σε καταλαβα.

 

Επισης, για να πετυχει κατι παρομοιο με τους function pointers που ζηταει ο φιλος, θα χρειαστει ο κωδικας της συνάρτησης που παραγεται να ειναι position independent (-fPic flag στο gcc αν θυμαμαι καλα). Ξεχασα να το αναφερω αυτο προηγουμένως.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πραγματικά δεν καταλαβαίνω τι θέλεις να πεις. :/ Έχεις κάποια πηγή να με κατευθύνει;

 

OK, λες να βάλω embedded Python στον κώδικά μου. Αυτός με ποια λογική; Να στείλω remote objects;

Αντι να στελνεις compiled native code, θα στελνεις scirpt

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τα διάφορα tasks μπορεί να έχουν και dependencies μεταξύ τους. Ο coordinator θα τα δρομολογίσει ανάλογα στους workers.

 

Αυτό που είπε ο παπί θέλω. Τα μηνύματα θα περιέχουν user defined συναρτήσεις (δε θα είναι κάτι στάνταρ δηλαδή αναλόγως τα data) + τα data, τα οποία είναι οι παράμετροι των συναρτήσεων. Δεν κάνω δηλαδή RPC.

 

Οι workers θα εκτελούν τις συνάρτησεις που καθορίζει ο χρήστης. Δεν έχουν στάνταρ/καρφωτή συμπεριφορά δηλαδή.

 

Σε τι θα τις καθορίζει ο χρήστης;

 

Εγω εννουσα πως την μνημη που μεταφερει δεν μπορει να την εκτελεσει ετσι οπως ειναι, γιατι δεν ειναι ειναι εκτελεσιμη μνημη. Ειχα δοκιμασει κατι παρομοιο με αυτο που λες (mmap με PROT_EXEC flag και μεταφορα του PC register με inline asm ωστε να δειχνει στην θεση απο την οποια ξεκινανε τα instructions μου στο runtime) αλλα επαιρνα διαρκως SIGILL. Δεν ξερω μπορει να εκανα και κατι λαθος. Εκτός αν εννοεις κατι διαφορετικο και δεν σε καταλαβα.

 

Επισης, για να πετυχει κατι παρομοιο με τους function pointers που ζηταει ο φιλος, θα χρειαστει ο κωδικας της συνάρτησης που παραγεται να ειναι position independent (-fPic flag στο gcc αν θυμαμαι καλα). Ξεχασα να το αναφερω αυτο προηγουμένως.

 

Αυτό εννοώ ναι. Όχι απαραίτητα στην περίπτωση που λέει ο gon. Και όντως υπάρχουν πολλές λεπτομέρειες που πρέπει να κάνεις σωστά για να δουλέψει, δεν ξέρω τι πήγε στραβά στη δική σου περίπτωση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε τι θα τις καθορίζει ο χρήστης;

Ο χρήστης βάζει ένα pragma στον κώδικα της εφαρμογής του πάνω από τα tasks (κλήσεις συναρτήσεων) που θα καθορίζει χοντρικά σε ποιο core της cpu θα εκτελεστεί το task (θα έχω ένα process ανά core και με pids bound στα cores).

 

Αν εννοούσες τα dependencies, τότε αυτά καθορίζονται στα pragmas ως in-out dependencies των tasks.

Αντι να στελνεις compiled native code, θα στελνεις scirpt

Τι επιβάρυνση θα έχει όμως αυτό στην απόδοση; Επειδή φτιάχνω ένα run-time πρέπει χρησιμοποιώ λύσεις που να έχουν όσο το δυνατόν μικρότερο αντίκτυπο στην απόδοση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το overhead ειναι σχετικο με το πως θα δουλεψεις με τα data. Πχ κατι του στυλ mul(vectors,matrix) θα εχει μηδενικο overhead εφοσον η δουλεια θα γινει στο bind της mul, με την py απλα δινεις ενα hint το πως θα δουλεψουν τα data.

 

Εχεις κανα παραδειγμα απο user code/data?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Προς το παρόν κάτι πολύ απλό, του στυλ:

 

 

void dummy(int arg)
{
    printf("task %d\n", arg);
}

int main(void)
{
    for (uint16_t i = 1; i <= 5; i++)
        runtime_push_task(task_create(dummy, i));

    // Dummy synchronization barrier
    sleep(3);

    return EXIT_SUCCESS;
}

 

 

 

Θα μπορούσα να κάνω το ο,τιδήποτε εκεί μέσα. Πχ, με βάση το i να υπολογίζω το factorial(i) και να το εκτυπώνω.

 

Εντελώς prototype εδώ. To arg θα είναι void * και θα περνάει ο χρήστης κάποιο struct με τα data.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κανε ενα τεστ με py ή v8

V8 ειναι js. Εχει παρα πολυ απλο binding αλλα τραγικο compile και σεταρισμα

Η py εχει τραγικο binding, αλλα πολυ απλο σεταρισμα και compile.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Υπάρχει και η Lua πάντως άμα θες scripting, τώρα βέβαια δεν ξέρω πόσο καλύτερη ή χειρότερη είναι από js ή python για την περίπτωσή σου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...