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

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

Δημοσ.

Έχω δηλώσει τα παρακάτω 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).

 

Δημοσ. (επεξεργασμένο)

Χρησιμοποίησε 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

Επεξ/σία από vel0city
  • Thanks 1
Δημοσ. (επεξεργασμένο)
8 hours ago, vel0city said:

Χρησιμοποίησε constexpr και γενικά απεύφευγε τα defines για constants.

Ωραίος ευχαριστώ. Το έκανα με constexpr τελικά (την είχα δοκιμάσει και πριν αλλά λανθασμένα!).

Quote

Θα πρότεινα να υπολογίσεις και να βάλεις απλά τις τιμές (με comment για το πως υπολογιστηκαν).

Δεν είναι πρακτικό στην περίπτωση μου διότι έχω πολλά μεγέθη που διαμορφώνονται βάσει άλλων στο μοντέλο, οπότε κάθε φορά που έχω διαφορετικό μέγεθος διανύσματος θα πρέπει να τα αλλάζω όλα χειροκίνητα.

Επεξ/σία από Dr.Fuzzy
Δημοσ. (επεξεργασμένο)
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); }

 

Επεξ/σία από Dr.Fuzzy
Δημοσ.

Τα define ειναι copypaste, μονο constexpr οπως λενε τα παιδια. Επισης στα define ακολουθα καποιο nc, πχ αντι για SIZE βαλε PROJECTNAME_SIZE. Αν ήσουν σε windows θα ειχες προβλημα επειδη τοSIZE και το POINTS υπάρχουν.

  • Like 1
Δημοσ.
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.

  • Like 1
Δημοσ.
4 hours ago, defacer said:

Bonus stage για μερακλήδες, αυτό γίνεται και χωρίς constexpr, μόνο με features c++03, με template metaprogramming.

Δε μπορώ τώρα αλλά θα προσπαθήσω αργότερα να το γράψω για το χαβαλέ. Η ιδέα είναι ακριβώς η ίδια με αυτό που έκανες εδώ, απλά templates για να καλύψουν την απουσία του constexpr.

Ρίχτο μόλις μπορέσεις έτσι for science's sake.

Δημοσ. (επεξεργασμένο)
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))? Εβαλα αλλες τιμες και εβγαζε λαθος αποτελεσματα (και η δικια σου και η δικια μου εκδοχη αφου την αντεγραψα).

Επεξ/σία από vel0city
  • Like 1
Δημοσ. (επεξεργασμένο)
2 λεπτά πριν, Dr.Fuzzy είπε

Λάθος; Πες τιμή.

Για τιμες 14 και πάνω. Για 60 πχ. δίνει 6 ενώ είναι 19.

Επεξ/σία από vel0city
Δημοσ. (επεξεργασμένο)

Με πρόλαβαν αλλά ορίστε αυτό που είχα στο μυαλό μου, η 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 χρόνια ήταν άλλη ιστορία.

Επεξ/σία από defacer
  • Like 1
Δημοσ.

Να ρωτησω, αυτο το hls ειναι compiler που κανει compile c++ σε hardware. Σωστα; Το αποτελεσμα μπορεις να το εκτυπωσεις σε prototype  chip; Τι τιμες παζουν;

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

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

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

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

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

Σύνδεση

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

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