2022/3/13(日)

こんなページを見つけた。Vulkan入門のあちこちを直さなければいけなさそうで鬱。

https://github.com/KhronosGroup/Vulkan-Guide/blob/master/chapters/common_pitfalls.adoc


今日解いた競プロの問題。

ABC226-E 自力AC。性質を考察すれば、ループが1個の連結成分のみ2通りの向き付けがあり得て、ループがない木だったりループが2個以上あるグラフだと条件を満たす向き付け方法はないことが分かる。

ループを数える方法を少し悩んだが結局ループを律儀に数える必要はなく、なもりグラフかどうかの判定さえできればいいことが分かり、UnionFindで連結成分を調べて各連結成分ごとに辺の数=頂点の数かどうかを調べればよかった。

最近のABC水くらいが今の自分にはちょうどいい難易度に感じるな…ARC水やAGC水は「理解不能」みたいな類ではないし、むしろ言われれば難なく分かるものばかりだが、天才過ぎてゼロから解法を思いつくのは難しく感じる。


Vulkan入門を書き進めた。メモリ関連の概念の呼び分け方に苦慮している。

まず、物理的な実体としてはメインメモリとGPUのメモリ(いわゆるVRAM)があり、CPUからはメインメモリにしかアクセスできないがGPUからはメインメモリにもアクセスできる場合がある。CPU内蔵GPUなどの場合はほぼメインメモリを使っているらしい。

そして、プログラム上およびVulkan API上の概念としては、普通の変数を置く普通のメモリ(スタックメモリやヒープメモリなど)がまずあり、それとは別にVulkanで確保するデバイスメモリ(vk::DeviceMemory)がある。デバイスメモリはアプリケーションから直接操作できず、触る場合には普通のメモリにマップする必要がある。

デバイスメモリはイコールVRAMかというとそうではないらしい。最近まで誤解していたのだが。

デバイスメモリはGPUから触れるメモリを表すものであり、指す先はVRAMである場合もあればメインメモリである場合もある。そしてVulkanというAPIの設計としては、その指す先がVRAMなのかメインメモリなのかなどはプログラマは知らなくていいという形になっている。

初学者相手に説明する分にはハード寄りの細かい事情の説明は出来るだけ避けたいと自分は考えている(そもそもVulkan自体ハード寄りなものなので無理があるが)。メインメモリとVRAMの詳しい事情の説明は避け、「デバイスメモリ」と「普通の変数を置いておく普通のメモリ」という2軸での説明にしたいのだが、すると「普通のメモリ」の良い呼称が分からなくなってくる。「メインメモリ」と呼びたいところだが、デバイスメモリもメインメモリである場合があるため、「GPUはデバイスメモリにしかアクセスできない」は真だが「GPUはメインメモリにはアクセスできない」などと言うとこれは偽である。うかつに「GPUはメインメモリにはアクセスできないため、メインメモリにあるデータをデバイスメモリに移す必要がある」などと書こうものならこれは間違った情報になってしまう。

この「GPUからアクセスできない普通のメモリ空間」の良い呼称はないものか。これさえあれば全て上手くいくのだが。


放置しているラズパイピコを使ってみるために開発環境を構築しようと思ったのだが、何やってもコンパイルが通らない。

CMakeでやっていこうと思ったがどう設定すればいいのか分からない。ネットのある記事だとMSYSがおすすめされていたのでわざわざMSYSを入れていろいろ設定してみたが結局どうやっても死ぬので、WSLを使っておとなしく公式の指示に従ってみた。しかしそれもダメ。

CMAKE_C_COMPILERとCMAKE_CXX_COMPILERを指定しているのにコンパイラねーぞというエラーがでるので調べてみると、プロジェクトのCMakeのレシピの中でSDK中のCMakeを実行している。そんなのありかよ?exportで環境変数CCとCXXにコンパイラを指定したら通った。こうすれば横断的にコンパイラを指定できる。しかし今度は別のエラー。テストプログラムのビルドが通らんと。知るか。

_exitが存在しないと言っている。なんかしらのライブラリのオブジェクトファイルが結合されてないみたいな感じに見える。もしくはコンパイルされるべきライブラリがコンパイルされてないか。

Categories: