髭散らかし太技術国(転生)

ここでは研究や自作した何かなどの技術的な話や商品の役立ちそうな話を中心に語ります。

機械学習・GPUユーザー必見!CUDA・OpenCL・TensorFlow/Kerasより高速で簡単なOpenACC!

Pythonは便利ですがいくら頑張ってもCUDAには追いつけないです…
TensorFlow/Kerasを使えばフレームワークでなんとなくディープラーニングに限らない用途で使えるって話もありますけど、やっぱりスピードは大事。高速化したいですよねっ!
でもCUDAは難しそう…

大丈夫、そんなあなたにCのforとかの基本構文と少しのオプションだけで簡単にCUDA並の速さを手に入れられる方法をご紹介しましょう!!!!!

それが、


OpenACC



です!!!!!

なんとあの GPU メーカーである我らが NVIDIA 直々に作って推奨している規格なんです。
まだあまり知られていませんが、超最強。

さらに、2019年現在最新GPUのVoltaアーキテクチャではあのCUDAすら超える性能を引き出すことに成功しています!!!

もう一度言います。

CUDAより高速になることが
あるんです!

しかも、今まさにNVIDIAが必死に普及させようとしているので、無料でNVIDIA様の講習が受けられちゃいます。

CUDA と OpenCLOpenMP ならどれがいい?
いいえ、OpenACC です!!

OpenACC はなななんと AMD GPU にも Xeon Phi にも対応しています!!

qiita.com

詳しくはQiitaに書きましたので上記のURLを是非ご参照ください!!!!!*1

*1:めっちゃハイテンションですが深夜テンションなだけです。あとQiitaに書いた時点で私には一銭もお金が入らないです。悲しい。

Takashift、競プロを始めた件

10月後半忙しくって、書くこと無いなーってスルーしてましたが、すごくありました。


Takashift、競プロはじめたってよ。


始めたって言っても去年ちょっとだけAtCoderやってたりしたんで、初めてってわけじゃないです。しかも、競プロをやると言いつつ競うことは目的じゃないという(単芝)

ぶっちゃけ恥ずかしながらプログラミング言語のメソッドとかどのモジュール読み込むんだとかいちいち覚えていないんですよね。まあ、エディターとかで結構補助してくれるし、モジュールは若干困るけどどうせググればすぐ出てくるから、支障も実際の所あまり無いです。

ただ、どこかでこれじゃまずいなぁと思っていたのもまた事実。何か取り敢えず作りたいなぁ簡単に作れないかなって思った時に、いちいちどのモジュールが必要かググらないと簡単なコマンドラインツール一つ作れないのはやっぱり困りものです。まあCなら見なくてもある程度書けますが、サクッと作りたい時にC使いますか…?

というわけで、すぐにご所望のものが作れそうなプログラミング言語をいつでも書けるようにしておきたい!ので、定期的にプログラミングしようと思い立ちました。その題材としてAtCoderのABCを使いはじめたわけです。アルゴリズムもすぐに出てくるようになったらなお嬉しいし。

やってる言語ですがGo、RubyPythonの3つにしています。Goは元々結構でかいアプリを作っていたのである程度知っています。でも、チュートリアルを全部やったわけではないですし、割とうろ覚え。ですが、他の言語をやっているとこれ!って機能があって爽快な気分になれるし、コンパイル言語でスッキリしていて文字列操作とか一通り揃っている言語はまあGoですねって感じで(ゴルーチンも強し)。Rubyは色々と自由が効くので(その自由さが時として仇ですが)知っておけばなんか作りたい時に役に立つかなぁと言う感じ。あと作者の言う通り、書いてて面白みがあります。Pythonは実を言うとあんまり書き方がなじまないし、色んな所で言われてますが書いてて面白くないので自主的には基本書かない(と言いつつコード量からするとそこそこ書いてます。マジで覚える気がない言語ナンバーワン)です。でも取り敢えずすぐに作りたくて且つ他の人がいじることを念頭に置くならPythonでしょうね。Python2をPythonとだけ銘打って解説してるサイトはいい加減滅びろ。

ノルマは最低月イチで始めました。


そして…


起承転結が早いですが、1ヶ月目にしてダメなところが浮き彫りになりました。まず、月イチだと少なすぎます。最低2週に一回は書かないと記憶が…
忙しかったのでそれどころではなかったんですが、3週間も開くと忘却の彼方ですね。ABCって結構似たようなパターンが多いと思うんですが。トリリンガルでやってることも影響している可能性はありますね。ダメダメじゃないですかやだ~

そしてわかってはいましたが、私ってそもそも競プロには向いてないなぁということも改めて認識。ものにもよるけどタイムアタック的なことはあんまり好かないんですよね。まあ、プログラムを考えるのは楽しいんですけどね。

色んな人が居て人それぞれスタイルがあると思うんですが、少なくとも私はよく考えてからプログラミングします。そして、最初のチュートリアルならともかく、何も考えずに取り敢えず動くだけのコードを書くのは嫌いです。それにすでに正解があるものをみんなでよってたかって早く解いても意味ないじゃないとさえどこか頭の片隅で思ってるかも知れないです(それいっちゃあおしまいよぉ)。
こういう性格だから時間を競うのが合わないのは自明。
競うことを目的としてないのでいいんですけどね。こういう競プロの使い方があっても良いんじゃないかってユースケースになってもいいと思うし。時間だけがプログラミングの評価軸じゃないですよね?(実際業務でそれだけだったら、っていうのは想像したくない…)
もちろん、AtCoderを早く解ける人が凄いのは言うまでもないですし、そのほうが業務では絶対有利です。だからやってるんですよ(笑)

でも、世の中は偏見持ちの小物ばっかなので、競プロが出来ないのは努力じゃどうにもならないとか、プログラミングは才能が全てとか、そんなことを言う人はたくさん居ます。競プロ出来なくて自分にプログラミングの才能が無いんじゃないかっていう思う人が他にもいるかも知れないんで、そういう人のために言いますが、決して競プロが出来ないからと言ってプログラミングの才能が無いことの証明にはなりません。例えば、デバッグが開発時間の殆どを占めることはよくあることなのでデバッグの才能も重要です。でもデバッグの才能は実装の速さで測れません。また、既存のプログラムの理解が開発時間を支配することもありますが、これも同じです。プログラミングに於いて最も大事なのはやっぱりロジックを考える力で、プログラムの動きを考えられることです。そしてこれは一つの評価軸で一様に測れるものではないのです。セオリーが偉いなんて誰が決めたんですか?そんなに早くなくったって誰も考えないような素晴らしいロジックを考えられる人が居たらその人は確実に天才呼ばわりされます。

あんまり悪い例は出したくないですが、プログラミングの速さだけが滅茶苦茶早いために自分は天才だとイキりだして、終いにはチーム開発の現場で勝手に自分の得意な言語で好きなように書き、保守性をぶっ壊してくれる人だって居ます。人より上を目指すなら、速さは大事ですが、全てではないことをよく肝に命じておいてください。

あと、言語のメソッドとか実装について覚えられない理由も実は自分でわかっています。
結構ロジックに重点を置いてるんで、どの言語で書くとかどの関数でどういうふうに書くとかはあんまり重要視してないんです。そして、これは無意識にやってることなんでどうしようもないです。
こう書くとわかりにくいかも知れませんが、要するに無駄な努力はしたくない性格なんでしょう。

でもだからと言ってぱっと簡単に書ける言語を持たないのは自分にとってマイナスです。というわけでこれからも精進します。ついでに競プロにも強くなれるように。

あれっ?

なんかおんなじことやってる娘がいるみたい!しかもライブコーディングじゃん!! 捗る~

www.youtube.com

VTuber空高ちゃんをどうぞよろしくね!

基礎は大事という話

月イチで記事を書くのがお約束なんですが、今月は特段技術的に取り上げたい内容は無いのでこんなことを書いて置こうと思います。

最近色々と説明を要求される機会が増えているのですが、なんだかんだで中身がちゃんと説明できないということがままあったりします。

説明がタジタジなってしまうのは要するに基本がわかっていないからなんですよね。そしてついごまかそうとしたりしてしまうのが人間の心理というもの。諸行無常

私は結構感覚でこうすればうまくいくだろうという時もあったりして、それは幸い正しいことが多いですが、時として説明を求められると…
ということもあります。

でも、どこがどうなってこうなってるかっていう基本を理解していないのはとても危ういことだと思います。表面的なことだけわかってて自分はわかっていると思っている人も多いですが、それでその人はデバッグできるんでしょうか?

正直、ものを一から作るよりも修理や拡張の方がハードルが高いです。これは明らかな事実です。なぜなら、すでにある既製品と似たようなものを作るだけなら猿真似でもできてしまうことがざらにあるからです。一方で、修理や拡張は中身がある程度理解できていないとできません。

これはソフトウェアエンジニアに限った話ではないと思います。例えば、プラモデルを作れたらそれはもうエンジニアなんでしょうか?Pythonとかで既にある関数を組み合わせて既存のアプリに近いものを作るのは入門には良いと思うし、当然エンジニアの取る手段の一つとして良いと思いますが、これしかできない人は中身を、基本を理解しているんでしょうか?修理する時どうするんでしょうか?

だからものをただ作れるだけではエンジニアとは呼べないと思います。自称エンジニアは本物では無いんです。私も自分のことをまだ本物じゃないと思っています。ハードレベルの話もOSレベルの話も(なんとなくわかってるだけマシですが)怪しい知識だらけです。私が進んでいるのは学術の方なんだからなおさらヤバいです。でも普通のエンジニアの人はそんな完璧じゃなくても手がかりさえあれば原因にたどり着くことができるはずなので、そんなに厳しく無くても私くらいで十分かもしれません。

アカデミックで何が一番ヤバいかというとやっぱり説明できないことです。だから私は微妙に知識に抜けがあると感じるとちょっとずれたことをつい言ってしまうのです。でもそれが余計に墓穴を掘り進めてしまうこともあります。ですが自分がしっかり根拠を持ってその動作やら現象やらを説明できる自信があれば、そういう下手なごまかしもなくなるはずです。だってそんな事する必要無くなるのですから。

あと、基礎を理解しているとその上で起こっていることが大体理解できるようになります。色々と見通せるようになるんです。教授にはコンピューターの全体像が見えているように感じます。

それで基礎をちゃんと議論できるレベルまで体得するにはどうしたらいいかといえば、結局は好奇心をどれだけ膨らませられるかが肝心なんだと思います。D進できる人とできない人というのがいるというのはこの部分だと思います。前者は「どうやって動いているのか」に興味を持つことで自然と自主的に調べていって仕組みを理解できるんでしょうね。

今丁度私はソフトウェアの拡張開発をやっているところですが、本物になれるようにもう少し頑張ってみようかなと思っています。

コミケに初めてサークル参加した感想

7月の終わりに予告した通り、8/12(月)のコミックマーケット96(4日目)にサークル参加してきました。

f:id:higechira:20190819003456j:plain
インテル入ってる

higechira.hatenablog.com

出展側としては初参加でしたが、おかげさまで50部全部頒布することができました。ありがとうございます。

普段は割とすぐ記事化するのに今回はしばらく沈黙していましたが、先日あった出張前辺りから体調が悪く夏バテ気味で記事を書こうという気力が湧きませんでした。でもだんだん良くなってきています。

それで、せっかくなのでコミケ参加において有益な情報を残しておこうかなと思うのですが、感想を交えてつらつら書いていきたいと思います。

準備

持ち物

お釣り用の小銭は前もって用意しておきます。頒布しているうちに500円は溜まっていくのでそんなに多くなくても良いと思いますが、参考までに私は14枚用意しました。5000円対応のために一応千円札も何枚か持っておきます。最悪南棟なら会場内にケバブ?が売ってたので適当に崩してきてもらいましょう。

f:id:higechira:20190819003227j:plain
肉とかき氷でした

また、値札、テープ、マーカーなどを用意しました。ただし、会場の机はとても狭いので作業には向きません。今回バテてて前日までに用意できず、会場で開場までの間にサークル名の掲示物などを用意しましたが、案内の紙は自宅で作成を済ませたほうが良いです。

多くのサイトで書かれている机のテーブルクロスは今回用意しませんでした。見栄えが気になるならあるに越したことはないですが、私は実際に会場に行ってみて無くても良いと思いました。

あと、お金を入れる缶か何かはあったほうが良いと思います。百均とかでも売ってますが、今回は500円均一だったのでお菓子の空き缶で代用しました。

それと、お金が見える位置にあるのはあんまり良くないと思うので、小さいダンボールの箱を盾にしました。

夏コミなら必ず会場に付く前に飲み物を用意します(会場付近の店は混んでて品切れのことがある)。500mLだと足りないことがあるので、1Lのペットボトルがおすすめです。私は前日に冷凍してタオルにくるんで持っていくようにしています。

頒布物も忘れずに持っていきましょう。

持ち物はそんな感じです。

同人誌の制作と印刷

なんだかんだで本格的な制作は7月中旬からとなってしまいましたが、1週間ちょっとでどうにか仕上げました。せっかくなのでコピー本じゃなくてちゃんと製本しようと思ったので、脱稿は早めにしました。もう少し遅くても入稿できるらしいですが、すでに納期も伸びていたので印刷会社さんのためにもあんまりギリギリにしない方が良いです。

印刷会社さんは、自分の持っている同人誌の中で品質を見たうえで、値段を相談して決めました*1

ソフトは今回、本文はWordで書いて、表紙はPowerPointを使用しました。本文は白黒のつもりなので良いとして、表紙はカラーであるためイラストツールを使ったほうがCMYKで出力できて良かったのですが、時間がなかったので今回はパワポで作りました。仕上がりですが、若干暗いかな?くらいの感じでした。なお、表紙と中表紙と裏表紙は一枚で作成するのが一般的みたいです(中表紙が無ければ別々でも大丈夫っぽいです)。

サイズは本文はB5で作りましたが、本文、表紙ともに断ち切り前のサイズ(印刷業者にもよるけど縦横3mm余分に大きくする)で作ったほうが無難です。

そして、入稿についてですが、ファイル形式はPDFであれば一応どこも大丈夫みたいです(フォントは埋め込むように設定しましょう)。

当日会場まで直接搬入してくれるところがほとんどですが、私は今回、部数も少なく、事前の仕上がりがどんなもんか見てみたかったので自宅まで宅配してもらいました。ただし、直接搬入のほうが入稿締切が遅かったりします。

ちなみに、万が一の落丁等に備えて予備が付属しています。今回は50部の発注で予備6部でした。

当日の作業

今回は8時に駅に着くように向かいました。待ち合わせ場所ですが、りんかい線国際展示場駅前は混みまくるので辞めておいたほうが良いです。今回ゆりかもめ有明駅改札前集合にしましたが、人が溜まらないのでおすすめです。

配置場所はパイプ椅子が2つしか無いし、スペースもギリギリそれが収まる程度しかないです。南棟は後ろが少し広かったですが、気休めです。

C95で別サークルの手伝いをしたときはスタッフが回ってきましたが、今回は時間まで回ってきそうになかったので、自分でサークル窓口まで見本誌を提出しに行きました。同じフロアでも窓口が複数あったりするので自分のエリアの窓口がどこか確認してから行きましょう。今回私は間違えて自分のエリアと異なる担当の窓口に受付してしまいました(スタッフさんの仕事が増えます)。

荷物は机の下に置くのが基本となります。また、お隣さんに物と訪問者が侵食しないように注意しましょう。

見本誌とは別に閲覧用の見本を置いておくと来た人が安心して見れます。閲覧OKですと言っておくと更に安心します。

片付けは最終日も机の上に椅子を置くだけで良いとのことです。

交流

会場では必ず隣のサークルさんに挨拶をします。今回は親方さんと頒布物を交換したりしました(ボリュームがぜんぜん違うのに申し訳無さを感じました)。

同人誌即売会では「本を読んで買わずに去っていく」というおなじみの試練があります。これ、今まで参加してみて見てきたし、自分も実際にやってたりしていたので、覚悟はできているというか、遭遇しても大丈夫だと思ってたんですが、実際にサークル側として立ってみると結構不安になるもんですね。まあなかなか貴重な経験ですから知ることができて良かったです。尤もこれが即売会です。どんなもんか興味を持ってくれる人が結構いることもわかりました。なかなか難しいですが、もう少し敷居を下げた本を出してみようかなとも思いました(がそんな人にはすでにある、痛快コンピュータ学って本がおすすめだよ!)。

また、会場で実際に頒布するときには中身について感想を言って去っていくジェントルマンもいたりします。今回複数あったのは「NECのオーロラ*2を載せてほしかった」でした。特集ページに取り上げても良かったかも知れませんが、まだ確固としたメリットが確立されているとは言えないので次回以降検討します。補足すると、今回の本でベクトル型は過去のものとして紹介されてると思いますが、「要するにコスパで負けた」と書いていて、私自身は別にベクトル型が技術的に駄目だとは思ってないので、うまいこと使い分けができると良いのかなと思います。

また、余談ですが、私が確認した限りだとAMDは最近TOP500入りしていないのでちょっと強めに気合が足んねぇ!(ニュアンス)と書いていますが、現時点で一位のSummitの後継機にはCPU、GPUともにAMDを採用するらしく、HPC向けにもこれから本腰入れるっぽいです。

今回の状況

会場

南棟は極めて快適でした。常に涼しかったです。一方の西棟は灼熱地獄でした。本当に南棟に配置されて良かったです。

とは言っても来年の夏コミは5月なので、今回みたいにはならないと思います。

待機列の問題

1日目と2日目は学業の方の出張と出展準備に追われていたので、私は3日目から参加しましたが、11時頃に会場に着いたものの、待機列があるとスタッフに言われた方向に向かっても列に辿り着けず、ウロウロしているうちに場所が変わったという声を聞いて、とりあえず駅の方に向かって歩いたら階段の左に列ができていました。もっと駅側にも列があったりして「おかしいなぁ」と思いつつも30分〜1時間弱くらい?で入れたんですが、後から東の駐車場まで列が伸びていたという話を聞きました。

1時間も並んでいない私でさえ暑さでおかしくなりそうだったので、絶句。来場者数が日付の分増えるとはねぇ…

冬コミは対策してくれることを願っています。🙏

カタログの入手性

3日目の時点でカタログが売り切れてしまっていました。orz
つらたん
いつも事前購入しないで当日買いなんですがいままでは3日目でも売っていましたし、自分のサークルの載ったカタログが手に入らないなんてまさか思ってなかったんで、次回は是非部数を増やして〜

最後に

C97も申し込んだので、当選したら是非会場で会いましょう!
既刊も今回の半分くらいは持っていくつもりです。
感想もお待ちしています。

*1:今回はポプルスさんに頼みました。仕上がり良かったです。

*2:GPUみたいにPCIeで増設する形のベクトル型プロセッサ https://jpn.nec.com/hpc/sxauroratsubasa/index.html

髭散化汰でコミケ96にスパコンの本を出します(4日目(月)南ラ37b)

月イチで更新を心がけているため、取り敢えず今月はコミケの頒布物の宣伝です!!

令和元年8月12日(月)に開催されるコミックマーケット96の4日目にサークル初参加します。実は去年も別サークルの手伝いでチケット入場したのですが、その時に私にもサークル参加できそうだなと思って応募しました。

そして、運良く受かりました。

エリアはジャンルごとに固まっていて、本サークルのジャンルは同人ソフトです。場所は今回のコミケで初めて利用される南棟です。ラ列の37b(お誕生日席!)にいます。
ちなみに同人ソフトでは名前通りの同人ゲームなどはもちろんですが、ハードやソフトの評論本なども並んでいて結構カオスなことになっています。どうやら一次創作のVTuberもこのジャンルらしいですよ(二次創作は別ジャンル)。同人ソフトで島の中なのであんまりお誕生日席は特別な感じでもないかもしれませんが、お待ちしています!!

頒布物ですが、髭散化汰からは新刊1冊です。
タイトルは「誰も教えてくれない!? スパコンランキングTOP500の楽しみ方+最近のスパコン特集」

f:id:higechira:20190731230159p:plainf:id:higechira:20190731230307p:plain
表紙と裏表紙(目次)

キャッチコピーは「池上彰の番組よりも絶対に役に立つ知識が、今あなたの手元に。」
スパコンどころかコンピューターなんにもわかんない人(は言いすぎ?)向けにスパコンランキングとはなんぞやという話や最近のスパコンの話を書きました。
かなり入門だけどある程度詳しくても楽しめる内容になってます❗
内容は、上記右側の画像(裏表紙)下部に目次ありです(クリックで拡大)!!
コミケウェブカタログでは1ページだけですが本文ページの見本誌を掲載しています。

この他に八雲アナグラさん(id:anatofuz)からPerl1.0の本を一緒に頒布予定です(がもしかしたら間に合わないかもしれないとのことなので、QRコードの配布などになるかも)。

鈍器の方のカタログではこのサークルカットが目印です。

f:id:higechira:20190731224204p:plain
サークルカット

少しでも興味があれば是非一度立ち寄ってみてください!! お待ちしています!!

コミケウェブカタログのサークルページ webcatalog.circle.ms

サークル公式Twitter twitter.com

ECM-PCV80Uのマイク音質の改善を図る(スースー音を消す)

以前の記事でバ美肉活動を開始した私ですが、恋声周りだったり、音声周りでは結構調整を継続的に行なっています(つまりは TRY and ERROR)。

VTuber界のEテレ枠を目指すバーチャル鬼娘空高ちゃん

www.youtube.com

そんな中、マイクのノイズが結構気になるようになりました。というのも、OBSのノイズキャンセラーとかで上手いこと消せると思いきやいざやってみると音質が悪くなってしまい、ノイズ除去とのバランスが取れなかったため普通に録音すると常に「スー」というノイズが載ってしまうのです。

いわゆるホワイトノイズですが、USBオーディオボックスが悪いという話を聞いてマイク入力を直接接続可能なThinkPadに差してテストしてみたらそれはそれは全くノイズが無くなりました。マイク自体が安いのでこのオーディオボックスUAB-80は本当にタダの付属品ということなんでしょう。

ただし、マイク自体はそんなに悪くないので捨てるのは勿体無いです。私は代わりのUSBオーディオボックスとして、以下のものを買いました(レビューにノイズが消えると書いてあったので)。値段はたかだか1000円です。

USBボックスを変えてもノイズが消えなかったという記事もありますが、基本的に信号をいじるような場所じゃない限り大きなノイズは発生しないので、ここだけ変えれば普通は解決すると思います。

ちなみに、私の場合は、USBボックスにスピーカーも接続してみたところ「ピーッピーッ」というノイズが載ってしまったのでマイク単独で接続するようにしています。

これでホワイトノイズが消えたので、少しでも安く抑えたい人はご参考まで。

Matrix Market の行列を各種形式に変換するライブラリ BeBOP Sparse Matrix Converter の使い方

先日の学会で発表した実験で、 Matrix Market というサイトの正定値対称行列を利用しました。

これまでの進捗では行列を扱う性能評価をしてこなかったので、今回初めて知りましたが、CG法や連立方程式などで自前で解を得られる行列を用意するのは面倒なため、よく使われているサイトのようです。

ただ、有名なサイトならライブラリもたくさんあるだろうと思いきや、このサイトのデータを扱えるライブラリはそんなに多くありませんでした。今回の実験のプログラムはC++であり、疎行列はCSR形式で処理するプログラムなため、この形式に変換できるC++で利用可能なライブラリが必要でした。

そこで、BeBOP Sparse Matrix Converter が要件を満たしそうだったので、これを利用しようとしたのですが、結構使い方の説明が雑(失笑)

というわけで、ここに Matrix Market 形式をCSR形式に変換する使い方について記録しておこうと思います。

インストール

大体インストールについては以下を見れば README を読まなくてもいけます(ってページにも書いてあります)。

bebop.cs.berkeley.edu

3つの圧縮ファイルは全て同じディレクトリ下に展開します(READMEには別のディレクトリに展開したときの説明もあり)。 特に、Linux上にビルドする場合は、特にこだわって設定する必要がないなら、

  1. 環境変数 LD_LIBRARY_PATH を設定
    1. 例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nanashi/bebop/sparse_matrix_converter:/home/nanashi/bebop/bebop_util
  2. bebop_util/ で make
  3. sparse_matrix_converter/ で make

これだけです。

使い方

ここで説明するのは、Matrix Market 形式をCSR形式に変換する使い方です。

公式サイトでは以下のページに使い方が書いてありますが、ある場合の例しか書いてなくてわかりにくいです。雰囲気は掴めますがこれだけ見てやれっていうのはちょっと不親切。

bebop.cs.berkeley.edu

ソースコード

#include <bebop/smc/sparse_matrix.h>
#include <bebop/smc/sparse_matrix_ops.h>
#include <bebop/smc/csr_matrix.h>

みたいな感じで使います(まあこれは公式に書いてある)。

なお、このライブラリは C なので、C++で使うときはマングリングの問題を避けるために、以下のようにしましょう。

extern "C"{
    #include <bebop/smc/sparse_matrix.h>
    #include <bebop/smc/sparse_matrix_ops.h>
    #include <bebop/smc/csr_matrix.h>
}

私はこれを忘れて定義が参照されないエラーにハマり、数時間悩み続けました(結構初歩的なやつ)。

関数は以下のような感じで使います。
ちなみに、今回の場合、main関数内の VAL を float* にしていますが、ライブラリでの読み込み時は double* になっているようです。よって、キャストする必要がありますが、直接変換できないので、一旦 VAL_temp にコピーしています。

struct sparse_matrix_t* A_ = load_sparse_matrix(MATRIX_MARKET, "bcsstk17.mtx");
assert(A_ != NULL);
int errcode = sparse_matrix_convert(A_, CSR);
if (errcode != 0)
{
    fprintf(stderr, "*** Conversion failed! ***\n");
    // Note: Don't call destroy_sparse_matrix (A_) unless you 
    // can call free on val, ind and ptr.
    free(A_);
    exit(EXIT_FAILURE);
}

float *VAL;
struct csr_matrix_t* A = (struct csr_matrix_t*) A_->repr;
assert (A);
assert (A->nnz == (A->rowptr[A->m] - A->rowptr[0]));

posix_memalign((void **)&VAL, 64, VAL_SIZE * sizeof(float));
double *VAL_temp;
posix_memalign((void **)&VAL_temp, 64, VAL_SIZE * sizeof(double));

memcpy(VAL_temp, A->values, VAL_SIZE * sizeof (double));
memcpy(COL_IND, A->colidx, VAL_SIZE * sizeof (int));
memcpy(ROW_PTR, A->rowptr, (N+1) * sizeof (int));
for (int i = 0; i < VAL_SIZE; ++i)
{
        VAL[i] = (float)VAL_temp[i];
}

なお、CSR形式以外で利用したい場合は、各自ヘッダーファイルを参照してください。

コンパイル

以下の例のようなオプションを忘れずに。

-I/home/nanashi/bebop/sparse_matrix_converter/include -I/home/nanashi/bebop/bebop_util/include
-L/home/nanashi/bebop/sparse_matrix_converter -L/home/nanashi/bebop/bebop_util
-lsparse_matrix_converter -lbebop_util

実行時

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nanashi/bebop/sparse_matrix_converter:/home/nanashi/bebop/bebop_util を忘れずに。
これが嫌なら、静的ライブラリも付属しているので、そっちを利用するようにしましょう(通常は共有ライブラリが優先してリンクされます)。

利用例

一応、実験で使ったコードのリンクも置いておきます。

ちなみにやっている内容は、GPUFPGAを1プロセスで両方使うプログラムです。
あと、計算自体はOpenACCで書かれたプログラムとの演算速度の比較用なのであまり意味はないです。

github.com

OpenACCの方は、まだ開発段階ですが、圧倒的に少ない記述量で書けるのでもしよかったら覗いてみて。

github.com