Dr.Fuzzy Δημοσ. 30 Νοεμβρίου 2018 Δημοσ. 30 Νοεμβρίου 2018 Έχω δηλώσει τα παρακάτω definition και macro μέσα στο header: #define MAX_NO_POINTS 953 #define CLOG2(POINTS) (ceil(log2(POINTS))) και στη main δηλώνω: const int SIZE = (CLOG2(MAX_NO_POINTS) * 3); ap_uint<SIZE> con_list[MAX_NO_LEGAL_TRIANGLES] = { 0 }; και ο gcc διαμαρτύρεται ότι: error: the value of ‘SIZE’ is not usable in a constant expression note: ‘SIZE’ was not initialized with a constant expression Προφανώς το SIZE δεν αλλάζει σε compile time! Πως πρέπει να το δηλώσω διαφορετικά για το καταλάβει; Εννοείται φυσικά ότι αν καρφώσω στο ap_uint την τιμή αντί SIZE παίζει μια χαρά. (Το ap_uint είναι arbitrary precision unsigned integer type σε C++ High Level Synthesis και είναι defined στο ap_int.h, όπου ap_uint<N>, N είναι ο αριθμός των bits απο 1 έως 1024).
vel0city Δημοσ. 30 Νοεμβρίου 2018 Δημοσ. 30 Νοεμβρίου 2018 (επεξεργασμένο) Χρησιμοποίησε constexpr και γενικά απεύφευγε τα defines για constants. https://en.cppreference.com/w/cpp/language/constexpr Edit: Άκυρο, μάλλον ο λόγος είναι οτι οι συναρτήσεις ceil και log2 που χρησιμοποιείς δεν είναι constexpr, αρα και το παραπάνω να κάνεις δε θα δουλέψει. (Είχε βγεί ένα proposal, άρα ίσως να γίνουν στο μέλλον) Θα πρότεινα να υπολογίσεις και να βάλεις απλά τις τιμές (με comment για το πως υπολογιστηκαν) η να ψάξεις για constexpr ceil/log2 (η γενικά <cmath>) υλοποιήσεις απο βιβλιοθήκες, εκτός STL (υπάρχουν σίγουρα). Edit 2: Αυτή φαίνεται οκ, απλα σιγουρέψου οτί κανεις compile με C++14 support: https://github.com/Morwenn/static_math Επεξ/σία 30 Νοεμβρίου 2018 από vel0city 1
Dr.Fuzzy Δημοσ. 30 Νοεμβρίου 2018 Μέλος Δημοσ. 30 Νοεμβρίου 2018 (επεξεργασμένο) 8 hours ago, vel0city said: Χρησιμοποίησε constexpr και γενικά απεύφευγε τα defines για constants. Ωραίος ευχαριστώ. Το έκανα με constexpr τελικά (την είχα δοκιμάσει και πριν αλλά λανθασμένα!). Quote Θα πρότεινα να υπολογίσεις και να βάλεις απλά τις τιμές (με comment για το πως υπολογιστηκαν). Δεν είναι πρακτικό στην περίπτωση μου διότι έχω πολλά μεγέθη που διαμορφώνονται βάσει άλλων στο μοντέλο, οπότε κάθε φορά που έχω διαφορετικό μέγεθος διανύσματος θα πρέπει να τα αλλάζω όλα χειροκίνητα. Επεξ/σία 1 Δεκεμβρίου 2018 από Dr.Fuzzy
vel0city Δημοσ. 30 Νοεμβρίου 2018 Δημοσ. 30 Νοεμβρίου 2018 Α δουλεψε μονο με constexpr και τις συναρτησεις του STL?
Dr.Fuzzy Δημοσ. 1 Δεκεμβρίου 2018 Μέλος Δημοσ. 1 Δεκεμβρίου 2018 (επεξεργασμένο) 4 hours ago, vel0city said: Α δουλεψε μονο με constexpr και τις συναρτησεις του STL? To έκανα απλά με αναδρομή, το δήλωσα constexpr και το έβαλα μέσα στο header file. constexpr unsigned clog2(unsigned n) { return n == 1 ? 0 : 1+clog2(n+1 >> 1); } Επεξ/σία 1 Δεκεμβρίου 2018 από Dr.Fuzzy
παπι Δημοσ. 1 Δεκεμβρίου 2018 Δημοσ. 1 Δεκεμβρίου 2018 Τα define ειναι copypaste, μονο constexpr οπως λενε τα παιδια. Επισης στα define ακολουθα καποιο nc, πχ αντι για SIZE βαλε PROJECTNAME_SIZE. Αν ήσουν σε windows θα ειχες προβλημα επειδη τοSIZE και το POINTS υπάρχουν. 1
defacer Δημοσ. 1 Δεκεμβρίου 2018 Δημοσ. 1 Δεκεμβρίου 2018 9 hours ago, Dr.Fuzzy said: To έκανα απλά με αναδρομή, το δήλωσα constexpr και το έβαλα μέσα στο header file. constexpr unsigned clog2(unsigned n) { return n == 1 ? 0 : 1+clog2(n+1 >> 1); } Bonus stage για μερακλήδες, αυτό γίνεται και χωρίς constexpr, μόνο με features c++03, με template metaprogramming. Δε μπορώ τώρα αλλά θα προσπαθήσω αργότερα να το γράψω για το χαβαλέ. Η ιδέα είναι ακριβώς η ίδια με αυτό που έκανες εδώ, απλά templates για να καλύψουν την απουσία του constexpr. 1
Dr.Fuzzy Δημοσ. 1 Δεκεμβρίου 2018 Μέλος Δημοσ. 1 Δεκεμβρίου 2018 4 hours ago, defacer said: Bonus stage για μερακλήδες, αυτό γίνεται και χωρίς constexpr, μόνο με features c++03, με template metaprogramming. Δε μπορώ τώρα αλλά θα προσπαθήσω αργότερα να το γράψω για το χαβαλέ. Η ιδέα είναι ακριβώς η ίδια με αυτό που έκανες εδώ, απλά templates για να καλύψουν την απουσία του constexpr. Ρίχτο μόλις μπορέσεις έτσι for science's sake.
vel0city Δημοσ. 1 Δεκεμβρίου 2018 Δημοσ. 1 Δεκεμβρίου 2018 (επεξεργασμένο) template<int N, int Res = 0> struct Clog2 : Clog2<(N + 1 >> 1), 1 + Res>{}; template<int Res> struct Clog2<1, Res>{ enum{ value = Res }; }; int main() { return Clog2<10>::value; // returns 4 } https://godbolt.org/z/TZk-xo Recursive template metafunction μέσω inheritance. Γινεται και μέσω template specialization αλλα έτσι είναι πιο απλό. Edit: Btw εισαι σιγουρος οτι βρισκει οντως ceil(log2(x))? Εβαλα αλλες τιμες και εβγαζε λαθος αποτελεσματα (και η δικια σου και η δικια μου εκδοχη αφου την αντεγραψα). Επεξ/σία 1 Δεκεμβρίου 2018 από vel0city 1
Dr.Fuzzy Δημοσ. 1 Δεκεμβρίου 2018 Μέλος Δημοσ. 1 Δεκεμβρίου 2018 (επεξεργασμένο) Ωραίος! Λάθος; Πες τιμή. Επεξ/σία 1 Δεκεμβρίου 2018 από Dr.Fuzzy
vel0city Δημοσ. 1 Δεκεμβρίου 2018 Δημοσ. 1 Δεκεμβρίου 2018 (επεξεργασμένο) 2 λεπτά πριν, Dr.Fuzzy είπε Λάθος; Πες τιμή. Για τιμες 14 και πάνω. Για 60 πχ. δίνει 6 ενώ είναι 19. Επεξ/σία 1 Δεκεμβρίου 2018 από vel0city
Dr.Fuzzy Δημοσ. 1 Δεκεμβρίου 2018 Μέλος Δημοσ. 1 Δεκεμβρίου 2018 1 minute ago, vel0city said: Για τιμες 14 και πάνω. Για 60 πχ. δίνει 6 ενώ είναι 19. ceil(log2(60))=ceil(5.9069)=6
defacer Δημοσ. 1 Δεκεμβρίου 2018 Δημοσ. 1 Δεκεμβρίου 2018 (επεξεργασμένο) Με πρόλαβαν αλλά ορίστε αυτό που είχα στο μυαλό μου, η recursive template version: https://ideone.com/HTyNol Το ηθικό δίδαγμα από αυτό είναι ότι το template specialization λειτουργεί και στην περίπτωση που το template parameter είναι int, εκτός από την πιο γνωστή περίπτωση που είναι type. Το έμαθα διαβάζοντας κάποτε αυτό: https://en.m.wikipedia.org/wiki/Modern_C%2B%2B_Design. Πλέον δεν προκαλούν αίσθηση αυτά, αλλά πριν 17 χρόνια ήταν άλλη ιστορία. Επεξ/σία 1 Δεκεμβρίου 2018 από defacer 1
παπι Δημοσ. 2 Δεκεμβρίου 2018 Δημοσ. 2 Δεκεμβρίου 2018 Να ρωτησω, αυτο το hls ειναι compiler που κανει compile c++ σε hardware. Σωστα; Το αποτελεσμα μπορεις να το εκτυπωσεις σε prototype chip; Τι τιμες παζουν;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα