Journal Carnet de route - taume 0

Posté par (page perso) . Licence CC by-sa.
Tags : aucun
7
30
nov.
2018

Notes et découvertes faites lors de mes voyages informatiques

Vérifier si deux énoncés parmi N (N >= 2) sont vrais, en Python

sum(map(bool, l)) > 1

Je n'ai pas trouvé de one-liner satisfaisant qui s'arrête dès que la condition est vérifiée :-/

Spécialiser une fonction C(11) pour un type donné

Pour vérifier qu'on n'a pas un niveau de pointeur en trop :

void dump_ptr(void* ptr) { printf("%p",
(...)

Journal Conversion entre pointeurs de fonctions incompatibles

Posté par (page perso) . Licence CC by-sa.
Tags :
14
7
nov.
2018

Posons nous dans le cas suivant (oui ça commence direct)

int strange_apply(int (*f)(int) {

    return reinterpret_cast<(int(*)(int, int)>(f)(1, 2);

}

Ce code compile avec un warning depuis le dernier gcc, et c'est bien car c'est en fait un undefined behavior (cast entre types de fonctions incompatibles dans le cas présent).

Et pourtant on voit pas mal de code (...)

Journal Pythran - 0.9.0 - kozhamzer

Posté par (page perso) . Licence CC by-sa.
Tags :
23
7
nov.
2018

Petite mise en bouche en alexandrin pour annoncer une nouvelle version de Pythran, compilateur pour le Python scientifique.

L'automne arrive, avec son lot de feuilles mortes
Pythran jamais ne dérive, il fallait qu'il sorte
Pas de grande nouveauté, juste le nécessaire
Tout est vectorisé, vraiment il faut le faire !

Le logiciel est comme toujours disponible sur pypi, anaconda et Github.

Comme annoncé dans les vers ci-dessus, la grande nouveauté vient du passage de boost.simd à xsimd (...)

Journal Mémorisation partielle de fonction constexpr

Posté par (page perso) . Licence CC by-sa.
Tags :
23
25
sept.
2018

Demat'inal,

Dans la lignée des expériences C++ que j'essaie de partager ici, je vous soumets ce bout de code qui m'a bien amusé :

template<class F, class T, T... Vs>
struct memoized {
    auto operator()(T v) const
    {
        static constexpr frozen::map<T, decltype(F{}(v)), sizeof...(Vs)> cached = {{Vs, F{}(Vs)}...};
        auto where = cached.
(...)

Journal Pythran - 0.8.7

Posté par (page perso) . Licence CC by-sa.
20
17
sept.
2018

Demat'i-nal,

La mouture 0.8.7, tendrement nommée skol-loarn de Pythran, est de sortie. Rappelons que Pythran est un compilateur dédié au calcul scientifique pour Python. Il s'installe avec pip ou conda et nécessite juste un compilateur C++ qui parle le dialecte c++11 sur l'hôte. Car oui, Pythran fait partie de cette ignoble lignée des transpileurs…

Quelques liens utiles :

Journal Une structure partiellement constante en C++

Posté par (page perso) . Licence CC by-sa.
Tags :
27
6
juil.
2018

Hop, quelques réflexions sur un langage non réflexif.

Si on veut un tableau de taille statique, on peut utiliser depuis C++11 la classe std::array<T, N>.

std::array<long, 5> my_array{{1, 2, 3, 5, 8}};

Si on veut forcer ce tableau à ne contenir que des constantes utilisables à compile-time, on a la possibilité de marquer cette déclaration constexpr.

constexpr std::array<long, 5
(...)

Journal Pythran, en plein délire

Posté par (page perso) . Licence CC by-sa.
Tags :
50
23
mai
2018

Cher journal, je dois te confesser que j'ai déclenché quelque chose dont j'ai un peu honte.

Tu te souviens bien sûr de Pythran, ce compilateur pour noyau scientifiques écrit en Python, et de ce petit détail d'implémentation qui veut que le compilateur commence par transformer les fonctions Python en fonctions C++ template (a.k.a. transformer du code Python en meta-programme C++ pour faire stylé voire pédant).

Un choix de design a été de faire en sorte que ces fonctions ne (...)

Journal Pythran 0.8.5 - de l'intérêt des compilateurs

Posté par (page perso) . Licence CC by-sa.
Tags :
35
24
avr.
2018

Demat' Nal

Pythran, compilateur pour un sous ensemble du langage Python dédié au calcul scientifique, en est à sa version 0.8.5.

En guise d'exemple, il permet de transformer un code source comme celui là :

#pythran export weights(uint8[:,:])
#runas import numpy as np; x = np.arange(10, dtype=np.uint8).reshape(5,2); weights(x)

import numpy as np
def weights(input_data, threshold=0.3):
    n_seq, length = input_data.shape
    weights = np.zeros(n_seq, dtype=
(...)

Journal Pixel Art et C++14

Posté par (page perso) . Licence CC by-sa.
Tags :
22
3
avr.
2018

Petit délire illustrant l'usage de constexpr et de la biliothèsque frozen.

Première étape : faire un dessin en pixel art, par exemple:

  constexpr unsigned char bytes[] = "   ###              ###   "
                                    "  ##### ########## #####  "
                                    " #######          ####### "
                                    " ####                #### "
                                    " ###                  ### "
                                    "  #                    #  "
                                    "  #                    #  "
                                    " #    ###        ###    # "
                                    " #   #####      #####   # "
                                    " #  #### #      # ####  # "
                                    " #
(...)

Journal Obfusque ton code avec C++

Posté par (page perso) . Licence CC by-sa.
15
16
mar.
2018

Cher Nuit-Nal,

toi qui aime le C++11, tu as peut-être déjà essayé de concaténer des chaînes constantes, suivant ce scénario là :

struct Some {
    static constexpr char Name[] = "Mr Popo";
};

char const *escape() {
    auto dogs = cats("hey, ",  Some::Name, " what's up?");
    return dogs;
}

int main() {
  char const* concat = escape();
  puts(concat);

  return 0;
}

(...)

Journal Jouons avec le ``switch`` et C++17

Posté par (page perso) . Licence CC by-sa.
Tags :
27
5
mar.
2018

Et non, ceci n'est pas un journal sur la switch, juste un partage rapide et amusé d'une version alambiquée mais qui fait tourner la tête (comme beaucoup de choses sortant d'un alambic, n'est ce pas ?):

template<unsigned N>
__attribute__((noinline)) void stuff()  {}

// manual switch
void manual_switch(int i) {
    switch(i) {
        case 0: return stuff<0>();
        case 1: return stuff<1>
(...)

Journal Formation à Lyon : Compilateurs pour le Python Scientifique

14
25
oct.
2017

Cher journal,

Du 7 au 9 novembre (2017 hein) aura lieu à Lyon une formation ouverte à tous sur le Python scientifique, ou plus exactement sur l'accélération de code scientifiques écrits en Python à travers trois compilateurs : Cython, Numba et Pythran. Trois compilos, trois approches, vive la diversité ! Et avec en bonus un petit aperçu sur l'évaluation de performances dans le cas de codes hybrides Python/natif.

Il y a certes un biais tout franchouillard à présenter Pythran (...)

Journal PyConfr2017 - Boudu !

Posté par (page perso) . Licence CC by-sa.
Tags :
20
26
sept.
2017

PyconFr, tu viens pour les talks et tu te retrouves à apprendre plein de trucs en discutant avec les uns et les autres. Et puis entre les anciens étudiants, les core devs Python ou Mercurial, il y avait du beau monde et plein de trucs à apprendre. Hop aperçu non exhaustif des deux sujets qui m'ont marqués (ce qui n'enlève évidement aucun intérêt aux autres sujets).

Mais avant ça merci à Quarkslab pour m'avoir permi d'aller à cette conf, et (...)

Journal Pythran 0.8.2 — compilation de noyaux scientifiques écrits en Python

Posté par (page perso) . Licence CC by-sa.
Tags :
38
14
sept.
2017

Mâtin, quel journal !

Pythran est bien vivant
Un vrai compilateur !
Et heure après heure,
Le bonheur vient en codant !

Mais des mois s’écoulèrent,
Sans que je postasse,
Le moindre mot dans l’air,
Ça manque un peu de classe

Et là, tout à coup, soudainement, surgit la version 0.8.2 de Pythran. Que s’est‐il passé depuis mon dernier soliloque sur LinuxFr.org ? Allez, plongeons dans le journal des modifications, mais avant ça, un petit rappel sur Pythran, par l’exemple.

Vous voyez ce bout (...)

Journal Frozen - Une alternative à gperf pour les utilisateurs de C++14 fan de constexpr

Posté par (page perso) . Licence CC by-sa.
Tags :
36
22
mai
2017

Ce journal présente frozen, une bibliothèque open-source, à base d'en-tête qui fournit une version rapide, non-modifiable, compatible avec une utilisation dans un contexte constexpr des bien connus std::set, std::map, std::unordered_map et std::unordered_set, pour C++14. Elle peut être utilisée comme une alternative à gperf.

Introduction

J'ai toujours trouvé frustrant qu'une variable globale déclarée const std::set<int> keys = {1, 2, 3} soit initialisée (...)