Ubuntu20.04 Wifi設定(コマンドラインから)

Netplan +Networkmanagerを使用して、Ubuntu20.04のWifi設定をコマンドライン行った。使用しているのは20.04だが、18.04でも可能。

準備

対象PCにNetplanをインストールする。おそらく標準でインストールされているので必要ないかもしれない。

$ sudo apt update
$ sudo apt install netplan.io network-manager

Netplanについて

Ubuntuにおいてsystemd-networkdかnetwork-managerがNetworkの設定や管理などなどを行っている。ただ、もっとわかりやすく設定をおこないたい、ということでNetplanが生まれた。注意点としてはNetplanはsystemd-networkdかnetwork-managerの設定ファイルを生成するのみで、実際に仕事をしているのはsystemd-networkdかnetwork-managerである。

Netplanでの設定はyamlファイルで書き、それを/etc/netplanディレクトリにおいて、netplan applyコマンドで適用する。

設定

今回は以下のような設定を行う。

  • Wifiを接続する。
  • 固定IP&DHCPを設定する。

wifiバイスが接続されていることの確認

下記コマンドを行う。wl…というような名前のデバイスが見つかればOK。このデバイス名はのちほど使用する。 (命名はudevというデーモンが行っている。環境によって名前は異なってくる。)

$ ip a
~~~~
7: wlan0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

アクセスポイントの検出

下記コマンドでアクセスポイントを検出する。目的としているものが見つかればOK。

$ nmcli d wifi list
IN-USE  SSID          MODE   CHAN  RATE       SIGNAL  BARS  SECURITY  
*       XXXXXXXXXXX  Infra  6     16 Mbit/s  100     ▂▄▆█  WPA1 WPA2

Netplan用yamlファイルの記述

下記のようにファイルを記載する。内容は次のように変更する。

  • "wlan0"を自分のWifiバイス名に置き換える。
  • DHCPを使用しない場合は"dhcp4: false"とする。
  • addresses: は設定したい固定IPアドレスにする。下記だと"192.168.11.101/24"に設定される。
  • XXXXXXXXXXXは自分のSSIDに変更する。
  • xxxxxxxxxxxは自分のパスワードに変更する。
$ sudo vim /etc/netplan/99-manual.yaml
network:
  version: 2
  renderer: NetworkManager
  wifis:
    wlan0:
        dhcp4: true
        addresses: [192.168.11.101/24]
        access-points:
            XXXXXXXXXXX:
                password: "xxxxxxxxxxx"

設定の適用

下記コマンドで適用する。再起動は必要ない。(ただし、設定をやり直したりすると再起動が必要な場合がある。)

$ sudo netplan apply

確認

下記コマンドでIPが振られていることを確認する。(192.168.11.6/24はDHCPで振られたもの。)

ちなみにSSHでは6でも101でもどちらでもアクセスできる。

$ ip a
~~~~
7: wlan0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.6/24 brd 192.168.11.255 scope global dynamic noprefixroute wlan0
       valid_lft 169127sec preferred_lft 169127sec
    inet 192.168.11.101/24 brd 192.168.11.255 scope global secondary noprefixroute wlan0
       valid_lft forever preferred_lft forever

外部ネットワークに接続されているかはpingとばしたり、apt updateしてみると良い。

JetsonNano起動高速化

JetsonNanoの起動を高速化する。 Systemdサービスで不要なものを止めて起動を高速化してみる。 結果としては倍以上高速化することができた。

制限事項

今回計測するのはKernelが起動してから、初期化処理が終わるまでです。 実際にはその前にBIOSなど(L4TだとBootROMやCboot)が入るので、電源ONからの起動時間は表記+10秒程度はかかっています。

使ったイメージ

Jetpack 4.4イメージを使用した。ただし、パッケージなどいろいろと追加で入れているので参考まで。

developer.nvidia.com

ユースケース

自分の使用方法は下のような感じなので、最低限これができる用になればいい。ほかはすべて止める。

現状確認

下のコマンドで起動にかかる時間が調べられる。

$ systemd-analyze 
Startup finished in 7.068s (kernel) + 4.819s (userspace) = 11.887s
graphical.target reached after 4.799s in userspace

現状は11.9秒ほどかかっている模様。

GUICLI起動へ変更

CLI起動へ変更する。結果は以下の通り。

$ sudo systemctl set-default multi-user.target
$ sudo rebot

~~~ after rebot ~~~

$ systemd-analyze 
Startup finished in 1.743s (kernel) + 7.076s (userspace) = 8.820s
multi-user.target reached after 7.053s in userspace

8.8秒まで短縮された。2.9秒の改善。

解析

以下のコマンドでサービスのうち、起動処理のクリチカルチェインがわかる。 見方としては、@の後ろに書いてある時間がそのサービスが起動開始した時間、+の後ろに書いてある時間が起動にかかった時間である。ちなみに.targetはそれに必要なサービスを集めたものなので、それ自体に処理は存在しない。(例えばmulti-user.target はCLI起動に必要なサービスを集めたもの。Networkなどが含まれる。)

$ systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @7.053s
└─networkd-dispatcher.service @1.247s +5.805s
  └─basic.target @1.049s
    └─sockets.target @1.049s
      └─snapd.socket @1.043s +5ms
        └─sysinit.target @1.038s
          └─systemd-timesyncd.service @821ms +217ms
            └─systemd-tmpfiles-setup.service @701ms +65ms
              └─local-fs.target @692ms
                └─local-fs-pre.target @692ms
                  └─keyboard-setup.service @443ms +248ms
                    └─systemd-journald.socket @433ms
                      └─system.slice @429ms
                        └─-.slice @417ms

見てみるとnetworkd-dispatcher.serviceが5.8秒と大きく足を引っ張っていそう。これをどうにかできないか考える。

networkd-dispatcher.serviceって何ぞ?

下記コマンドでサービスの説明や状態が確認できる。 "Dispatcher daemon for systemd-networkd"らしい。わからん。

$ systemctl status networkd-dispatcher.service
● networkd-dispatcher.service - Dispatcher daemon for systemd-networkd
   Loaded: loaded (/lib/systemd/system/networkd-dispatcher.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-01-14 22:08:56 JST; 31min ago
 Main PID: 3991 (networkd-dispat)
    Tasks: 2 (limit: 4174)
   CGroup: /system.slice/networkd-dispatcher.service
           └─3991 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
...

どうやらPython3で/usr/bin/networkd-dispatcherを実行しているらしい。中身を見ると、Wifiの設定やリゾルバの設定などを行っていた。以下はNetworkManagerの説明だが、DispacherはNetwork接続時に実行するプログラムを管理するためのものである模様。

wiki.archlinux.jp

また、これはsystemd-networkd用のサービスである。今回はNetworkManagerに統一するので停止してしまう。

$ sudo systemctl disable networkd-dispatcher.service
Removed /etc/systemd/system/multi-user.target.wants/networkd-dispatcher.service.
$ sudo rebot

~~~ after rebot ~~~

$ systemd-analyze 
Startup finished in 1.833s (kernel) + 4.640s (userspace) = 6.473s
multi-user.target reached after 4.614s in userspace

6.5秒まで短縮した。2.3秒の短縮。

個別にサービス停止

これ以降は大きな差がなかったので、すべてのサービスを見て不要なものは停止する。

$ systemctl -t service
UNIT                      LOAD   ACTIVE SUB     DESCRIPTION
alsa-restore.service      loaded active exited  Save/Restor
apport.service            loaded active exited  LSB: automa
avahi-daemon.service      loaded active running Avahi mDNS/
console-setup.service     loaded active exited  Set console
containerd.service        loaded active running containerd 
cron.service              loaded active running Regular bac
dbus.service              loaded active running D-Bus Syste
getty@tty1.service        loaded active running Getty on tt
grub-common.service       loaded active exited  LSB: Record
haveged.service           loaded active running Entropy dae
kerneloops.service        loaded active running Tool to aut
keyboard-setup.service    loaded active exited  Set the con
kmod-static-nodes.service loaded active exited  Create list
ModemManager.service      loaded active running Modem Manag
networking.service        loaded active exited  Raise netwo
NetworkManager.service    loaded active running Network Man
nv-l4t-usb-device-mode.service loaded active exited  Config
nvargus-daemon.service    loaded active running Argus daemo
nvgetty.service           loaded active running UART on tty
nvmemwarning.service      loaded active running Display Low
nvphs.service             loaded active running PHS daemon
nvs-service.service       loaded active running NVS-SERVICE
polkit.service            loaded active running Authorizati
resolvconf.service        loaded active exited  Nameserver 
rpcbind.service           loaded active running RPC bind po
rsyslog.service           loaded active running System Logg
serial-getty@ttyGS0.service loaded active running Serial Ge
serial-getty@ttyS0.service loaded active running Serial Get
setvtrgb.service          loaded active exited  Set console
snapd.seeded.service      loaded active exited  Wait until 
speech-dispatcher.service loaded active exited  LSB: Speech
ssh.service               loaded active running OpenBSD Sec
systemd-journal-flush.service loaded active exited  Flush J
systemd-journald.service  loaded active running Journal Ser
systemd-logind.service    loaded active running Login Servi
systemd-modules-load.service loaded active exited  Load Ker
systemd-random-seed.service loaded active exited  Load/Save
systemd-remount-fs.service loaded active exited  Remount Ro
systemd-resolved.service  loaded active running Network Nam
systemd-sysctl.service    loaded active exited  Apply Kerne
systemd-timesyncd.service loaded active running Network Tim
systemd-tmpfiles-setup-dev.service loaded active exited  Cr
systemd-tmpfiles-setup.service loaded active exited  Create
systemd-udev-trigger.service loaded active exited  udev Col
systemd-udevd.service     loaded active running udev Kernel
systemd-update-utmp.service loaded active exited  Update UT
systemd-user-sessions.service loaded active exited  Permit 
ubuntu-fan.service        loaded active exited  Ubuntu FAN 
user@1000.service         loaded active running User Manage
whoopsie.service          loaded active running crash repor
wpa_supplicant.service    loaded active running WPA supplic

  • alsa-restore.service: サウンド。停止。
  • apport.service: クラッシュ時のログ収集。残す。
  • avahi-daemon.service: ローカルネットワーク上のサービス検出(プリンタとか)。停止。
  • console-setup.service: コンソールの設定。サービスでわざわざ設定しなくても大丈夫では?停止。
  • containerd.service: Dockerの関係者。残す。
  • cron.service: プログラムなどを自動実行。停止。
  • dbus.service: Dbus。残す。
  • getty@tty1.service: TTY。残す。
  • grub-common.service: grubのなにか。grubは使ってないので停止。
  • ModemManager.service: モデム。使う予定ないので停止。(LTEとかつかうならいるかも。)

ちょっと多すぎるのでここまでで一旦試してみる。

$ sudo systemctl disable alsa-restore.service avahi-daemon.service console-setup.service cron.service grub-common.service ModemManager.service


Synchronizing state of avahi-daemon.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable avahi-daemon
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable cron
grub-common.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable grub-common
Removed /etc/systemd/system/dbus-org.freedesktop.Avahi.service.
Removed /etc/systemd/system/multi-user.target.wants/console-setup.service.
Removed /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.
Removed /etc/systemd/system/dbus-org.freedesktop.ModemManager1.service.
Removed /etc/systemd/system/multi-user.target.wants/ModemManager.service.

ログを見ると、alsa-restore.service はDisableできていない。このように依存関係などによってDisableできない場合がある。そのときはDisableより強いmaskを使用する。これはそのサービスを/dev/nullにリンクしてしまう。そのため十分に注意して操作を行い、動作確認をしっかり行うこと。

$ sudo systemctl mask alsa-restore.service
Created symlink /etc/systemd/system/alsa-restore.service → /dev/null.

これで無効化できた。再起動して起動時間を計測。

$ sudo rebot

~~~ after rebot ~~~

$ systemd-analyze 
Startup finished in 1.767s (kernel) + 3.764s (userspace) = 5.532s
multi-user.target reached after 3.741s in userspace

結果

5.5秒まで短縮。最初と比較すると倍以上高速化することができた。

すべてのサービスは確認できていないので、また時間があるときにつづきやります。

また、maskした影響で、他のサービスがエラーになったりしていないか、下記のコマンドで確認しておく。

$ systemctl -t service

JetsonNanoでPython3.8でDHT11

JetsonNanoでDHT11を動かした。

DHT11とは

GPIO1本で温度・湿度が図ることのできるセンサー。 精度やサンプリングレートは良くないが、温度も湿度も測れるセンサーとしては非常に安価であり、広く用いられている、らしい。

  • データシート

akizukidenshi.com

Amazon.co.jp: VKLSVAN 3個セット DHT11温度センサー モジュール湿度センサーモジュール デュポンラインと付属 Arduinoに対応: DIY・工具・ガーデン

配線

以下の用につないだ。(画像はラズパイですが使ったのはJetson Nanoです。)

f:id:wooolwoool:20210113204149j:plain
配線

ライブラリ

ラズパイ用にはいろいろ公開されているがJetsonNano用のものはそんなになかった。 今回は以下を使用。

github.com

ただ、これはPython2用のライブラリなのでPython3用にポーティングして使用する。

手順

まずはリポジトリをクローン。

$ git clone --recurse-submodules -j8 https://github.com/GrgoMariani/NVidia-Jetson-DHT22-Python

READMEに書いてある通り、Pinを使用するものに変更する。今回は以下のようにする。

#define PIN0 jetsonnano_pin32
#define PIN1 jetsonnano_pin31

続いてビルド。今回はPython3で使うのでPython3でビルド。そうするとPy_Initializeじゃないのか?と聞かれる。(ネタバレするとPython3ではPy_InitModuleを使えないので手を加える必要がある。ビルドはできるのでひとまずこのまま進めてみる。)

$ python3 setup.py build
~~~
C_DHT.c:173:8: warning: implicit declaration of function ‘Py_InitModule’; did you mean ‘Py_Initialize’? [-Wimplicit-function-declaration]
  (void)Py_InitModule("C_DHT", C_DHT22Methods);
        ^~~~~~~~~~~~~
        Py_Initialize
C_DHT.c:174:1: warning: control reaches end of non-void function [-Wreturn-type]
 };
~~~

インストール。

$ python3 setup.py install

試してみる。

$ python3
>>> import C_DHT
Traceback (most recent call last):
  File "", line 1, in 
ImportError: /usr/local/lib/python3.8/site-packages/C_DHT.cpython-38-aarch64-linux-gnu.so: undefined symbol: Py_InitModule

Python3用ではないのでエラー。なのでソースコードを修正する。

対象:C_DHT.c

まずは以下の行を削除。

PyMODINIT_FUNC
initC_DHT(void){
        (void)Py_InitModule("C_DHT", C_DHT22Methods);
};

そして以下の行を最後に追加。

static struct PyModuleDef C_DHT =
{
       PyModuleDef_HEAD_INIT,
       "C_DHT", /* name of module */
       "",          /* module documentation, may be NULL */
       -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
       C_DHT22Methods
};

PyMODINIT_FUNC
PyInit_C_DHT(void){
        return PyModule_Create(&C_DHT);
};

ビルド+インストール。

$ python3 setup.py build
$ python3 setup.py install

試す。

$ python3
>>> import C_DHT
>>>

うまく行きました。

サーバーでDockerでJupyter notebook

リモートサーバーでJupyter notebookを使う場合、SSHでログイン後、--ipオプションをつけて起動すれば良い。

$ jupyter notebook --ip=*
[W 12:06:27.853 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 12:06:27.854 NotebookApp] The port 8888 is already in use, trying another port.
[I 12:06:27.862 NotebookApp] Serving notebooks from local directory: /home/XXX
[I 12:06:27.862 NotebookApp] Jupyter Notebook 6.1.6 is running at:
[I 12:06:27.862 NotebookApp] http://XXX-desktop:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224
[I 12:06:27.862 NotebookApp]  or http://127.0.0.1:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224
[I 12:06:27.863 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 12:06:27.879 NotebookApp] No web browser found: could not locate runnable browser.
[C 12:06:27.879 NotebookApp] 
    
    To access the notebook, open this file in a browser:
        file:///home/XXX/.local/share/jupyter/runtime/nbserver-9183-open.html
    Or copy and paste one of these URLs:
        http://XXX-desktop:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224
     or http://127.0.0.1:8889/?token=58287be265ecc0a16b21c0eeecb9e07d89ebb80078cf6224

起動確認後、クライアントでブラウザからhttp://<jupyter実行ホストのIP Address>:<port番号(上記だと8889)> にアクセスすればいい。port番号は使用されていないものでデフォルト(8888)から一番近いものが使用される。そのため、毎回同じでない可能性があるため、他人のNotebookにアクセスしないよう注意。(まあ、Passwordがあるので大丈夫だと思う。)

ただ、この状態だと環境が共通となってしまい不便である。そのためDockerを使用してJupyter notebookを実行する方法を示す。

準備(Dockerのインストール)

下記を参考にDockerをインストールする。GPUを使用したい場合は、Nvidia-Dockerも導入する。

docs.docker.com

medium.com

コンテナ起動

コンテナを起動して、Jupyter notebookをインストールする。このとき、--network hostオプションを使用することで、外部からのアクセスが可能となる。

下記だとPython3.8のイメージでコンテナを起動している。

$ docker run -it --network host python:3.8-slim-buster bash
# apt update && apt install  python3-pip python-pip -y && pip3 install jupyter

通常時とほぼ同様に、Notebookを起動する。--allow-rootをつけておかないと怒られて起動しないので注意。

# jupyter notebook --ip=* --allow-root

起動後、http://<jupyter実行ホストのIP Address>:<port番号> にアクセスすると、Notebookが使える。設定したパスワードは覚えておく。

終了する

終了する場合はjupyter notebook を実行したターミナルでCtrl + CでNotebookを終了し、exitまたはCtrl + Dでコンテナから抜ける。

コンテナの動作状況は、以下のように確認できる。

$ docker ps -a
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS                    PORTS               NAMES
ce6c11aa6e9a        python:3.8-slim-buster              "bash"                   27 minutes ago      Exited (0) 2 seconds ago                       great_meninsky

再起動する

コンテナをRestartして、コンテナのなかに入る。この場合、コンテナIDまたはコンテナ名が必要なので、上のdocker psコマンドで調べておく。

コンテナIDの場合

$ docker restart ce6c11aa6e9a
$ docker exec -it ce6c11aa6e9a bash
# jupyter notebook --ip=* --allow-root

コンテナ名の場合

$ docker restart great_meninsky
$ docker exec -it great_meninsky bash
# jupyter notebook --ip=* --allow-root

bashが必要ない場合は、直接起動してもOK。

$ docker restart ce6c11aa6e9a
$ docker exec -it ce6c11aa6e9a jupyter notebook --ip=* --allow-root

Jetson Nanoのセットアップ方法(Docker)

Jetson Nanoを購入したので、セットアップ方法をメモしておく。 購入から、Nvidia Docker上でCUDAを動かすところまで行う。 セットアップ後、ストレージは十数GB消費されていたので、SDカードは32GB以上のものを使用するといい。

セットアップ方法の種類

セットアップには以下の3種類がある。

WindowsPCを使用する場合は1番のみしかできないため、この方法で行った。

1. 配布しているイメージをSDカードにフラッシュする

今回はJetpack SDKイメージを使用した。

書き込み方法

developer.nvidia.com

配布イメージ1:Jetpack SDK

developer.nvidia.com

配布イメージ2:学習用のイメージ

courses.nvidia.com

2. NVIDIA SDK Managerを使用する

developer.nvidia.com

3. 独自にRootFSを用意してフラッシュする

developer.nvidia.com

docs.nvidia.com

初期セットアップ

イメージをSDカードにフラッシュし終わったら、Jetson Nanoに挿入し、モニター、キーボード、マウスを接続し、電源をつけて画面にしたがってユーザー名などの設定をおこなう。

完了したら、再起動を行う。

アップデート

Aptパッケージのアップデートを行う。 デスクトップ上でCtrl + Shift + T でターミナルを開き、以下を実行する。

$ sudo apt update
$ sudo apt upgrade

Docker groupへの追加

sudo をつけなくてもdockerコマンドが使用できるよう、グループに追加する。

※ 該当ユーザーでログインしていること。

※ Dockerを事前にインストールしておくこと。(Jetpack SDKにはすでにインストールされているため必要なし。)

$ sudo gpasswd -a $USER docker

DockerイメージのPull

NvidiaはJetson用にDocker イメージを配布している。これを使用するとセットアップが楽。 以下にアクセスし、ユーザー登録し、欲しいコンテナを探す。TensorFlowインストール済のものなど様々ある。

www.nvidia.com

今回はDeeplearning用に一通り揃っているイメージを使用する。 以下コマンドでイメージをPullする。また、イメージがPullできていることを確認する。

$ docker pull nvcr.io/nvidia/l4t-ml:r32.4.4-py3
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
nvcr.io/nvidia/l4t-ml   r32.4.4-py3         7ef384cfc62b        2 months ago        4.41GB

Docker コンテナの起動&確認

コンテナを起動し、サンプルプログラムを実行しGPUを認識していることを確認する。NVIDIA Tegra X1が認識されていればOK。

$ docker run -it --rm --privileged --runtime nvidia --network host nvcr.io/nvidia/l4t-ml:r32.4.4-py3 bash
# cd /usr/local/cuda/samples/bin/aarch64/linux/release
# ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA Tegra X1"
  CUDA Driver Version / Runtime Version          10.2 / 10.2
  CUDA Capability Major/Minor version number:    5.3
  Total amount of global memory:                 3964 MBytes (4156796928 bytes)
  ( 1) Multiprocessors, (128) CUDA Cores/MP:     128 CUDA Cores
  GPU Max Clock rate:                            922 MHz (0.92 GHz)
  Memory Clock rate:                             13 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 262144 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.2, CUDA Runtime Version = 10.2, NumDevs = 1
Result = PASS

プライバシーポリシー・免責事項

プライバシーポリシー

個人情報の利用目的

当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。 取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。

広告について

当ブログでは、第三者配信の広告サービス(GoogleアドセンスA8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。

Cookieを無効にする方法やGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご確認ください。

また、当方は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。

アクセス解析ツールについて

当ブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにクッキー(Cookie)を使用しております。トラフィックデータは匿名で収集されており、個人を特定するものではありません。

コメントについて

当ブログへのコメントを残す際に、IP アドレスを収集しています。 これはブログの標準機能としてサポートされている機能で、スパムや荒らしへの対応以外にこのIPアドレスを使用することはありません。 なお、全てのコメントは管理人が事前にその内容を確認し、承認した上での掲載となります。あらかじめご了承ください。

免責事項

当ブログからのリンクやバナーなどで移動したサイトで提供される情報、サービス等について一切の責任を負いません。

また当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

著作権について

当ブログで掲載している文章や画像などにつきましては、無断転載することを禁止します。

当ブログは著作権や肖像権の侵害を目的としたものではありません。著作権や肖像権に関して問題がございましたら、お問い合わせフォームよりご連絡ください。迅速に対応いたします。

リンクについて

当ブログは基本的にリンクフリーです。リンクを行う場合の許可や連絡は不要です。

ただし、インラインフレームの使用や画像の直リンクはご遠慮ください。