Fikir iletmek dışında önemli olduğunu bulamadım ve performans açısından kritik alanlarda çalışıyorum (ışın izleme, görüntü ve ağ işleme, parçacık sistemleri, fizik motorları, vb.) Ve birçok özel algoritma ve veri yapısı geliştirmek zorunda kaldım Ar-Ge'de çalışırken. Bu alanlarda, genellikle çok verimli veri yapıları ve algoritmaları bir avuç yepyeni üstün ürünler sunarken, dünün algoritmaları mevcut ürünleri eski hale getirir, bu yüzden her zaman işleri daha verimli yapma arayışı vardır. Yine de bir uyarı olarak, tasarladığım algoritmalar hakkında hiçbir makale yayınlamadım. Hepsi tescilliydi. Yapsaydım, kanıtları formüle etmek için bir matematikçinin yardımına ihtiyacım olurdu.
Yine de benim görüşüme göre, her yineleme için hesaplamalı çalışma miktarı, algoritma gerçekten zayıf bir şekilde ölçeklenmediği sürece, algoritmanın ölçeklenebilirliğinden çok daha fazla ilgi çekmektedir. Birisi ışın izleme için en son teknolojiyi kullanırsa, algoritmik karmaşıklıktan çok veriyi nasıl temsil ettiği ve eriştiği gibi hesaplama teknikleriyle daha fazla ilgilenirim çünkü makul ölçeklendirilebilirlik zaten bu rekabetçi ve yenilikçi senaryoda verilmiştir. Ölçeklemeyen algoritmalar ile rekabet edemezsin.
Tabii ki, ikinci dereceden karmaşıklığı lineermik ile karşılaştırıyorsanız, bu çok büyük bir farktır. Ancak alanımdaki çoğu insan epik bir girdiye kuadratik karmaşıklık algoritması uygulamaktan kaçınmaya yetecek kadar yetkin. Bu nedenle ölçeklenebilirlik genellikle derinden ima edilir ve daha anlamlı ve ilginç sorular şu şekilde olur: “GPGPU'yu kullandınız mı? SIMD? Paralel olarak mı çalışıyor? Verileri nasıl temsil ettiniz? Önbellek dostu erişim düzenleri için yeniden düzenlediniz mi? ne kadar sürer? Bu davayı güçlü bir şekilde ele alabilir mi? Belirli işlemleri mi yapıyorsunuz yoksa hepsini tek seferde mi yapıyorsunuz? ”
Doğrusal bir algoritma bile, eğer eski belleğe daha optimal bir şekilde erişirse, örneğin, çoklu okuma ve / veya SIMD için daha uygunsa, bir doğrusal zaman algoritmasından daha iyi bir performans sergileyebilir. Bazen doğrusal bir algoritma bile bu nedenlerden dolayı logaritmik bir algoritmadan daha iyi performans gösterebilir ve doğal olarak doğrusal zaman algoritmaları ufacık girdiler için logaritmik olanlardan daha iyi performans gösterir.
Bu yüzden benim için önemli olan, veri temsilleri (bellek düzenleri, sıcak / soğuk alan bölmeli erişim modelleri, vb.), Çoklu okuma, SIMD ve zaman zaman GPGPU gibi bazı kişilerin "mikro optimizasyonlar" olarak adlandırdığı şey. Her zaman yeni kağıtların yayınlandığı her şey için son teknoloji algoritmaları kullanmak için zaten herkesin yeteri kadar yetkin olduğu bir alanda, algoritmik sihirbazları yenmedeki rekabet üstünlüğünüz algoritmik karmaşıklıktaki gelişmelerden daha doğrudan gelmiyor hesaplamalı verimlilik.
Alanım mükemmel matematikçiler tarafından yönetiliyor, ancak her zaman yaptıklarının hesap maliyetini ya da kodu hızlandırmak için birçok alt düzey numarayı bilenler değil. Bu genellikle benim için çok daha az karmaşık olmasına rağmen daha hızlı ve daha sıkı algoritmalar ve veri yapıları geliştirmemde benim için bir avantaj. Donanımın neye benzediğini, bitlere ve baytlara karşı oynuyorum ve gerçekten karmaşık olan algoritmadan biraz daha fazla iş tekrarı yapıyor olsam bile, her işin yinelenmesini çok daha ucuz hale getiriyorum - benim durumumdaki iş çok daha ucuz. Yazdığım kod da çok daha basit olma eğilimindedir. İnsanlar basit algoritmaların ve veri yapılarının mikro-optimize edilmiş versiyonlarının anlaşılmasının ve sürdürülmesinin zor olduğunu düşünüyorsa,
Temel bir örnek olarak, çarpışma tespiti ve gereksiz noktaların giderilmesi için şirketimizde bir KD ağacından daha iyi performans gösteren basit bir ızgara yapısı ile karşılaştım. Aptal ham şebekem, algoritmik olarak çok daha az karmaşıktı ve medyan noktasını bulma yöntemiyle KD-ağacını uygulayan adamdan daha matematiksel ve algoritmik olarak daha aptalca davrandım, ancak sadece şebekemin bellek kullanımını ve erişim modellerini ayarladım. çok daha sofistike bir şeyi daha iyi yapmak için yeterliydi.
Benden daha zeki insanlar tarafından yönetilen bir alanda hayatta kalmama izin veren bir diğer avantaj, aynı şekilde geliştirdiğim yazılımı kullandığım için kullanıcının nasıl çalıştığını gerçekten anlamak. Bu bana gerçekten kullanıcı çıkarlarıyla hemen uyum sağlayan algoritmalar için fikirler veriyor. Temel bir örnek olarak, çoğu insan mekansal indeksleme kullanarak çarpışma tespiti gibi şeyleri hızlandırmaya çalışıyor. Örneğin, birkaç yıl önce organik modeller için basit bir kariyer şekillendirici gözlem yaptım, örneğin, eğer bir karakter ellerini yüzüne koyarsa, mekansal bir indeksleme yapısının düğümleri bölmek ve karakterden pahalı güncellemeler yapmak isteyeceği sonra elini onun yüzünden çıkardı. Bunun yerine, tepe konumlarından ziyade bağlantı verilerini temel alarak bölümlenirseniz, ağacı hızla bölmek ya da yeniden dengelemek için çok hızlı bir şekilde güncellenen ve asla yeniden dengelenmesi gerekmeyen kararlı bir hiyerarşik yapıya sahip olabilirsiniz (sadece sınırlayıcı kutuları her animasyon karesini güncellemek zorunda) Temel kavramı anladılarsa, ancak matematikçilerden kaçan, bir şeyi bir şey düşünemediklerinden, kullanıcıların nasıl çalıştığına ve sadece geometrinin özellikleri hakkında çok fazla düşündükleri ve ne kadar geometri düşündükleri ile ilgili olanları anlayabilirlerdi. yaygın olarak kullanıldı. Genel hesaplama bilgisine ve kullanıcı sonu bilgisine algoritmik sihirbazlıktan daha çok eğilerek yeterince iyi geçiniyorum. Her neyse, algoritmik karmaşıklığa odaklanmanın gerçekten önemli olduğunu bulamadım.