Je n'ai pas trouvé cela aussi important que de communiquer des idées et je travaille dans des domaines critiques pour la performance (raytracing, traitement d'images et maillages, systèmes de particules, moteurs physiques, etc.) et j'ai dû concevoir de nombreux algorithmes propriétaires et structures de données. en travaillant dans la R & D. Dans ces domaines, une poignée de structures de données et d'algorithmes très efficaces peut donner lieu à de tout nouveaux produits de pointe, tandis que les algorithmes d'hier rendent les produits existants obsolètes, ce qui permet de toujours agir de manière plus efficace. Cependant, je n'ai jamais publié aucun article sur les algorithmes que j'ai conçus. Ils étaient tous propriétaires. Si c'était le cas, j'aurais besoin de l'aide d'un mathématicien pour formuler des preuves, etc.
Pourtant, à mon avis, la quantité de travail de calcul par itération présente souvent un intérêt plus immédiat que l’évolutivité de l’algorithme, à moins que l’algorithme ne soit vraiment mal adapté. Si quelqu'un propose une technique de pointe pour le lancer de rayons, les techniques de calcul telles que leur représentation et leur accès aux données m'intéressent plus que la complexité algorithmique, car une évolutivité raisonnable est déjà une donnée dans ce scénario concurrentiel et innovant. Vous ne pouvez pas être concurrentiel en proposant des algorithmes non évolutifs.
Bien sûr, si vous comparez la complexité quadratique au linéarithmique, c'est une énorme différence. Mais la plupart des gens de mon domaine sont suffisamment compétents pour éviter d’appliquer un algorithme de complexité quadratique sur une entrée épique. L’évolutivité est donc souvent profondément impliquée, et les questions les plus significatives et les plus intéressantes deviennent: "Avez-vous utilisé GPGPU? SIMD? Est-il exécuté en parallèle? Comment représentez-vous les données? Avez-vous réorganisé les paramètres d’accès au cache? Comment Peut-il gérer ce cas de manière robuste? Reportez-vous certains traitements ou faites-vous tout en même temps? "
Même un algorithme linéarithmique peut surpasser un algorithme à temps linéaire si le premier accède à la mémoire selon un modèle plus optimal, par exemple, ou s’il est mieux adapté au multithreading et / ou au SIMD. Parfois même un algorithme linéaire peut surpasser un algorithme logarithmique pour ces raisons, et naturellement, les algorithmes à temps linéaire surpassent les algorithmes logarithmiques pour les entrées minuscules.
Ce qui compte davantage pour moi, c’est donc ce que certaines personnes appellent des "micro-optimisations", telles que les représentations de données (agencements de mémoire, modèles d’accès avec découpage en champs chaud / froid, etc.), le multithreading, le SIMD et, occasionnellement, le GPGPU. Dans un domaine où tout le monde est déjà suffisamment compétent pour utiliser des algorithmes de pointe décents pour tous avec de nouveaux articles publiés tout le temps, votre avantage concurrentiel pour vaincre les assistants algorithmiques ne provient pas d'une amélioration de la complexité algorithmique, mais d'une approche plus directe. efficacité de calcul.
Mon domaine est dominé par de brillants mathématiciens, mais pas toujours par des connaisseurs du coût en calcul de ce qu’ils font ou de nombreuses astuces de niveau inférieur pour accélérer le code. C'est généralement mon avantage sur eux en concevant des algorithmes et des structures de données plus rapides et plus stricts, bien que le mien soit beaucoup moins sophistiqué. Je joue avec ce que le matériel aime, en bits et en octets, et chaque itération de travail est beaucoup moins chère, même si je fais un peu plus d'itérations de travail que l'algorithme très sophistiqué - le travail dans mon cas est considérablement moins cher. Le code que j'écris a aussi tendance à être beaucoup plus simple. Si les gens pensent que les versions micro-optimisées d'algorithmes simples et de structures de données sont difficiles à comprendre et à maintenir,
À titre d’exemple de base, j’ai mis au point une structure de grille simple qui surperformait un arbre KD dans notre entreprise en matière de détection de collision et d’élimination de points redondants. Ma stupide grille brute était tellement moins sophistiquée sur le plan algorithmique et je suis bien plus bête mathématiquement et algorithmiquement que le gars qui a implémenté KD-tree avec sa nouvelle façon de trouver le point médian, mais je viens d’ajuster l’utilisation de la mémoire et les modèles d’accès, et c'était suffisant pour surperformer quelque chose de beaucoup plus sophistiqué.
Un autre avantage qui me permet de survivre dans un domaine dominé par des personnes beaucoup plus intelligentes que moi est simplement de comprendre le fonctionnement de l'utilisateur, car j'utilise le logiciel que je développe de la même manière. Cela me donne des idées d’algorithmes qui s’alignent vraiment très immédiatement avec les intérêts des utilisateurs. À titre d’exemple fondamental, la plupart des gens essaient d’accélérer des processus tels que la détection de collision en utilisant l’indexation spatiale. Il y a près de vingt ans, j’ai fait une simple observation de la carrière pour les modèles organiques: par exemple, si un personnage pose ses mains sur son visage, une structure d’indexation spatiale voudra avoir à scinder des nœuds et à effectuer des mises à jour coûteuses si le personnage puis enleva sa main de son visage. Si, à la place, vous partitionnez sur la base de données de connectivité plutôt que de positions de sommet, vous pouvez vous retrouver avec une structure hiérarchique stable qui se met à jour très rapidement et qui n'a jamais besoin de scinder ou de rééquilibrer l'arbre (il suffit de mettre à jour les cadres de sélection pour chaque image d'animation) ... Ce genre de chose - des algorithmes pour un enfant sans arrière-plan mathématique important pourraient venir s’ils comprenaient le concept de base, mais ceux qui ont échappé aux mathématiciens, car ils ne pensaient pas aux choses de manière aussi proche de la façon dont les utilisateurs travaillaient et pensaient trop aux propriétés de la géométrie et non à la façon dont la géométrie était couramment utilisé. Je m'entends assez bien en m'appuyant davantage sur les connaissances informatiques générales et les connaissances des utilisateurs finaux que sur la magie algorithmique. Donc de toute façon, je n'ai pas vraiment trouvé important de se concentrer sur la complexité algorithmique.