ベゞェ曲線、Arduinoの速床、1぀の興味深いサむト、たたは週末の過ごし方に぀いお

「誰でもむルカず䞀緒に灰色のパラドックスを解決できたす。そしお、あなたはむルカなしでそれをやろうずしたす。 」




実際、私は週末を少し違った方法で過ごしお、ヘリコプタヌハックに行くこずを蚈画したした私はヘリコプタヌのファンだったのではなく、若者が発明したものを芋お、そのようにたむろしおいたしたが、姉は断固ずしお反察したした。 もちろん、私は䞻匵したした぀たり、䜕床か笑いながら、「たあ、ずにかく...それはずにかく楜しいかもしれたせん」ず蚀ったが、圌女は容赊なく、劻が圌女の偎にいたずき、旅行のチャンスはなかった。 たあ、「本圓に欲しくなかった」のですが、私は自分で発明したプログラミング分野の面癜いパズルを少し座っお報告したした。

必芁な泚意-前の週末は意図されおいた、それは垞にそのようなものです-プログラムの䜜成には数時間かかり、それに関するレポヌトを䜜成し、公共亀通機関での5日間の旅行は完了したせん。

最近の投皿で、著者はずりわけMKのベゞ゚曲線KBの蚈算を比范的匱いパラメヌタヌで加速する問題を怜蚎したした。 実際、これらのパラメヌタヌは70幎代の平均的なメむンフレヌムのレベルですが、珟時点では明らかに䞍十分であるず考えられおいたす。 特定のアクションの結果ずしお、著者は蚈算をやや高速化するこずができたので、私の意芋では明らかに十分ではないので、最初の近䌌ずしおこれをどのように行うべきかを曞くこずにしたした。 スピヌドで問題を解決するための普遍的なレシピを完党に知っおいたす-より高い頻床でMKを䜿甚するか、別の家族に切り替えるために、私はそれを研究したずきから、それが䜕であるか、単に䜕もなかったから、蚀葉からたったく来たせんでした。 珟時点では、このアプロヌチは時代遅れですが、Habrの珟代の読者には無関心ではないように思えたした。

問題を定匏化したす—極倀AずB、および仮想焊点Cで定矩されるベゞェ曲線䞊の点の座暙をできるだけ早く蚈算したす。曲線䞊の点Pの蚈算匏は、

1P=T∗T∗B+2∗T∗1−T∗C+1−T∗1−T∗A

ここで、Tは0から1たで倉化したす。 Wikiでは、この公匏はか぀お秘密であり、奇劙なこずでしたが、䜕でも可胜だず曞いおいたす。 耇雑な圢匏ではなく、X座暙ずY座暙を個別に怜玢するこずは明らかです。この匏で算術挔算の笊号の数を数えるだけで、蚈算の耇雑さを掚定したす-7回の乗算ず5回の加算=> 7 * 5 +  優れたコンパむラヌそしお今ではすべおのコンパむラヌが優れおおり、明瀺的に犁止しない堎合は完党に最適化されたすは、コストを7 * 3 +に削枛する可胜性がありたすが、事前に1-Tを蚈算するこずで支揎する方が良いでしょう 䞀般的に蚀えば、優れたコンパむラヌは䞀般に、匏のすべおの倀が定数で衚されおいるのかどうか疑問に思うこずがありたすが、すべおの倀が静的に未定矩であるず仮定したす。

パヌト1、数孊


最適化プロセスを開始し、ブラケットを開き、Tで甚語をグルヌプ化したすい぀かコンパむラヌがこれを行うこずができるかもしれたせんが、これたでのずころ、䜜業のこの郚分は自然知胜に割り圓おられおいたす

2P=T∗T∗B+A−2∗C+T∗2∗C−A+A

=> 5 * 5 +。これは、初期倀の7 * 5 +よりも明らかに優れおいたすが、比范的改善された7 * 3 +を匕き続き怜蚎する必芁がありたす。

加算挔算を1぀ずしお完了するのに時間がかかる堎合、乗算を完了するのにかかる時間は、原則ずしお正確に1぀以䞊になりたすが、その皋床はMKの実装に䟝存したす最初に曞いた-アヌキテクチャに぀いおですが、これは完党に真実ではありたせん。 クリスタルにハヌドりェア乗算噚がない堎合、乗算実行時間は1の10倍30+倍になり、存圚する堎合は数倍1-6になりたす。 したがっお、乗算を加算で眮き換えるず、ほが垞に実行時間の増加そしお重芁な堎合が倚いが埗られるず安党に想定できたす。 さお、固定小数点数から浮動小数点ぞの移行この事実の蚌拠は残しおおきたすにより、加算の実行時間が20倍以䞊増加したすここでの調敎は非垞に圱響力がありたすが、乗算ではわずかに増加するだけです。 。 したがっお、浮動小数点数の堎合、加算ず乗算の時間は、特に盞察的な芳点ではほずんど異なりたせんが最倧2倍ず予枬できたす、それらは䟝然ずしお異なり、乗算を支持したせん。そのため、ここにゲむンがありたす。

前のパラグラフに戻るず、PTの堎合、5 * 5 +の栌付けは7 * 3 +に比べお倧きな利点はないはずですが、匕圓金は残っおいたす。 パラメヌタヌTが倉化し、曲線の他のすべおのパラメヌタヌが固定されおいる堎合ただし、定数ではないが申し蚳ありたせん、ベゞェ曲線䞊の点のセットを蚈算する必芁があるずいう事実に泚意しおください。その埌、匏の残りの郚分を事前に蚈算しお取埗するこずができたす

3P=T∗T∗A1+T∗B1+A

=> 3 * 2 +、ここで A1=A+B−2∗Cそしお B1=2∗C−Aすでに良いですが、ホヌナヌのスキヌムを思い出しお曞くず

4P=T∗T∗A1+B1+A

=> 2 * 2 +、「額」の決定ず比范するず、2回以䞊、ほが3回勝぀必芁があり、これらの最適化は完党に明癜です。

理論を実際に確認しおみたしょうこれは完党に冗長ですが、芋積もりには自信がありたすが、突然コンパむラヌを過小評䟡したした。実際のハヌドりェアでのさたざたなオプションの実行のリアルタむムを枬定する必芁がありたす。 たあ、たたたた自宅でさたざたな䌚瀟のMK甚のさたざたなデバッグボヌドを持っおいるこずがありたすLuminary MicroやIntel Edissonのデバッグなどの珍しいものを今すぐ賌入しおみおくださいが、Arduinoボヌドは1぀ではありたせんパむナップルはありたせん」。 それは行き止たりのように思えたすが、オプションがありたす-非垞に興味深いサむトtinkercad.comが私たちの助けになりたす.Arduinoモゞュヌルを䜿甚しおブレッドボヌド䞊に回路を構築し、スケッチを曞いおすぐに実行できたす。 同時に、ブレヌクポむントの蚭定、プログラムのステップ実行、および実際のArduinoにずっおは前䟋のないブレヌクダりン時の倉数の倀を衚瀺するこずもできたす。

このサむトに目を向け、枬定を開始したす。 たず、操䜜の実行時間に関する想定を確認し、呚囲の状況をクリアした埌、敎数に぀いお次のデヌタを取埗したす。

8 + 8 => 8-1ビヌト、16 + 16 => 16-2、
8 * 8 => 16-2、16 * 16 => 16-14予想倖であるこずが刀明した唯䞀のものは、4 * 2 + 4 * 2 = 16が埗られるず思い、興味深い最適化がありたす、
8/8 => 8-230、16 / 16 => 16-230。

最埌の2桁に泚意しおください。本圓にすぐにカりントしたい堎合、陀算操䜜が犁止されおいるこずは明らかです。 最終的に24ビットの仮数を持぀PTの数で操䜜を実行するのにかかる時間を枬定したす
a + b-126オペランドに倧きく䟝存、a * b-140、a / b-482。
埗られたデヌタは、理論䞊の仮定ずよく盞関しおいたす。このMKに搭茉されおいるハヌドりェア実装は、乗算ではなく、陀算ではなく、挔算であるPTであるこずがわかりたす。

今、私たちは完党な蚈算の時間を枬定し始めたす。 倀A = 140、B = 120、C = 70を蚭定し、蚭蚈局に170の均等に分垃したポむントを䜜成したす。 なぜこれらの倀ず正確に䞀臎するのか-パフォヌマンスを評䟡するずきに指定された投皿でそれらが䞎えられたした。 以䞋は、アルゎリズムず察応するテスト実行時間です。

匏1=> 20msたたはサンプルあたり1,900クロックサむクル
匏1=> 18msたたはサンプルあたり1660クロックサむクル個別に1-Tを考慮
匏2=> 16msたたはサンプルあたり1540クロックサむクル
匏3=> 10msたたはサンプルあたり923クロックサむクル
匏4=> 8msたたはカりントあたり762メゞャヌ

結果の実行時間の短瞮20ミリ秒から8ミリ秒は予想ずよく盞関しおおり、蚈算を2倍以䞊高速化できたこずがわかりたす。 完党に明癜な考慮事項ず数孊に加えお、高校のコヌスを超えおいないこずに泚意しおください、私たちは必芁ありたせんでした。

次に、結果が十分でない堎合の察凊方法に぀いお説明したす。蚈算匏からすべおを絞り出しおいたす。 圌らはここで別の投皿ぞのコメントで私に曞いお、䞀般にどんな問題もFTでの蚈算に枛らすこずができ、仮定の明らかな論争にもかかわらずこれをNavier-Stokes方皋匏の数倀解法で詊しおみおください、この特定の堎合、この勧告は適甚可胜ですしかし、い぀ものように、埮劙な違いがありたす。

パヌト2、コンピュヌティング


アルゎリズムの倉曎が完了するず、デヌタ構造のみが残り、固定小数点数の土壌に入りたす。 ここでは、PTに぀いお考えおいなかった倚くの萜ずし穎を芋぀けたす-範囲ず粟床䞀般的に、PTに぀いおはこれらの問題に぀いお考える必芁がありたすが、ここではすべおが簡単で、倚くのこずが行われおいたす。 FTの必芁な衚珟を決定するために問題の小さな研究を行う必芁がありたす前述のポスト9.7で遞択され、結果から刀断するず明らかに䞍十分ですが、私はわずかに異なる道を取るこずを提案したす。 ちなみに、間隔で170ステップではなく、128このステップを犁止する理由はないず思いたすを採甚した堎合、この考えは完党に適合したす。 KBを定矩する定数が敎数で䞎えられるずいう事実を考慮し、唯䞀のパラメヌタヌTがフォヌムの䞀郚および/で衚されるこずができ、画面䞊のレンダリングに結果を䜿甚する堎合、぀たり敎数座暙に倉換する堎合、敎数ですべおを行うだけで、凊理がはるかに高速になりたす。

最埌の匏のみを䜿甚し、新しい衚蚘で曞き盎したす

5P=u/U∗u/U∗A1+B1+A

=> 2 * 2 + 2 /、ここでA1ずB1はPTず同じ方法で蚈算されたす。 明らかに、すべおの数倀は敎数であり、察応する操䜜ははるかに高速に実行する必芁がありたす。 敎数陀算2/3 = 1= 1.5の操䜜䞭に粟床を倱わず、最埌の瞬間に陀算を実行するために、匏をわずかに圢匏に倉換したす

6P=および∗A1+B1∗And/And∗And+A∗And/And

=> 4 * 2 + 2 /。 すべおのFT番号。したがっお、このアルゎリズムを実装しお...ここにいるのはおばあさんで、ナヌリ゚フの日... 1869サむクルですが、これはFTの堎合よりもはるかに悪いです。

デブリヌフィングを開始するず、倉数のタむプを倉曎するだけでは䞍十分であるこずがわかりたした。 たず、8たたは16ではなく32ビットの数倀を䜿甚する必芁がありたす。そうしないず、オヌバヌフロヌが発生したすが、PTよりも高速ですが、アルゎリズムの欠陥を補うのに十分ではない長い数倀が発生したす。再び各メゞャヌで定数が蚈算されたした-予備蚈算でそれらを削陀したすB2 = B1 * I、A2 = A * I * I それから

7P=および∗A1+B2∗および+A2/および/および

=> 2 * 2 + 2 /1684の結果は前のものよりも優れおいたすが、それでもこの点には埓いたせんでした。

もう1぀の定数And2 = And *の蚈算を陀倖するず、

8P=および∗A1+B2∗および+A2/II

=> 2 * 2 + 1 /、実行サむクルは956サむクルです-しかし、これは興味深いですが、1぀の操䜜を陀いお生産性が倧幅に向䞊したした。

それは私たちを遅くするものです-分割、それは非垞に時間がかかる操䜜であるためですが、私たちはそれに察凊するための興味深いトリックを持っおいたす。 匏1 /を蚈算するには、芁玠倉換1 /= 1 /*/= 1 *//を実行したす。 2の次数をHずしお遞択した堎合、Hによる陀算をシフトに眮き換えるこずができ、指数が8の倍数である堎合、偶数のシフトは必芁ありたせん。 そしお、N / Aの倀は正盎に蚈算する必芁がありたすが、蚈算サむクルでは乗算のみが残りたす。

完党に正しくない倉換を行い、N / Aを䞞められた倀Kに眮き換えお、敎数のみの挔算に移行するこずに泚意しおください。 䞍正確さは、粟床の䜎䞋にあり、このアプロヌチの本件ぞの適甚性を蚌明するために远加の調査を実斜する必芁がありたす。 H / IをK * I + d/ I = K +d / Iの圢匏で蚘述したす。ここで、qはI未満です。H/ IからKぞの絶察誀差はd / Iになり、盞察誀差はd / IになりたすI /K + d / I> = d / I /K + 1〜d / I / K、ただし、K >> 1これはシフトではない。 絶察蚈算誀差はA * d / I / K> = A * 1 / N / Iに等しいため、Hの倀はできるだけ倧きく遞択する必芁がありたす。 ゚ラヌを1以䞊にしたくない堎合は、条件A / K <= 1、K> = Aに耐える必芁があり、K * I> = A * Iに倉換したす。぀たり、H> = A * Iを意味し、粟床が䜎䞋したす。 この堎合、A <= 256およびI <= 256の堎合、H> = 2 ** 16になりたすが、これはたったく問題ありたせん。 明らかに、䞊蚘の匏では、元の数倀のモゞュヌルを䜿甚する必芁がありたす。

将来に泚意しおください。切り捚おるのではなく、最も近い敎数に向かっおいくず、芁件はいくらか枛り、ニュアンスはありたすが、Hは半分になりたす。

いずれの堎合でも、必芁な粟床を確保し、次のアルゎリズムを取埗できたす。H = 2 ** 16; K = [N / A]I <256; 0 <=および<= AND;

9P=および∗A1+B2∗および+A2∗K>>16∗K>>16

=> 4 * 2 + 2 >> 16ここで、すべおの操䜜は長敎数で実行されたす。 このアルゎリズムを実装するず、583クロックサむクルが埗られたすが、これはすでに理想に近づいおいたすが、ただ理想的ではありたせん。

次に、特定のMKの小さな蚭定がありたす-グロヌバル倉数の操䜜はより高速です。 ロヌカルのものよりも、ロヌカルのものを登録するずさらに高速になり、時間は506クロックサむクルに短瞮されたす。

さらに、シフト前の最埌の乗算は16ビット数で実行できるこずに泚意しおください。これにより、504が埗られたす。

合蚈で、1900/504の「額」の実装ず比范しお蚈算を3倍以䞊高速化したした。正確に蚀葉を倱うこずはありたせんでした。 これは、私が時間の最適化ず呌ぶ結果であり、元の投皿で受け取った20ではありたせん。

さらに良い指暙を達成するこずは可胜ですか-可胜ですが、これは次の投皿のトピックです。

Source: https://habr.com/ru/post/J428113/


All Articles