質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

7216閲覧

CUDAのスレッド/ブロック数の決め方について

goldberg

総合スコア1

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/25 04:26

編集2020/06/25 04:53

前提・実現したいこと

数値計算のボトルネック解消のため、また個人的な興味から、CUDAの勉強を始めたところです。
基本的な概念は把握したのですが、スレッド/ブロック数の決め方の感覚がよくわかっていません。
(もちろん最終的には試行錯誤というのも了解しているのですが、現場の感覚に基づく相場観/方向性をご教示頂ければ幸いです。)

取り急ぎは、1枚のGPUボードの話でOKですが、もし余裕があれば、複数枚の取り扱いなど発展的な話題についても教えて頂ければ嬉しいです。

CUDAで走らせたいコード

例えば以下のような4重ループの計算をCUDAで実装できればと思っています。
arrayは計算に用いるデータ。dimとticksはintです。

dimの数を増やすと、おおよそ4乗で計算量が増えていくので、CPUだとすぐに苦しくなります。
GPUを活用することで、どこまで取り扱い可能なdimを増やせるかに興味を持っています。

Python

1def func(array, dim, ticks): 2 3 result = np.zeros((dim, dim, dim, dim)) 4 5 for j in range(dim): 6 for k in range(j+1,dim): 7 for l in range(dim): 8 for m in range(l+1,dim): 9 for q_i in range(ticks): // 積分 10 result[j][k][l][m] += (arrayに基づいた計算) 11 return result

GPUの情報

手元のPCに刺さっているGPUはRTX2080Tiです。deviceQueryの結果は次のとおりです。

Device 0: "GeForce RTX 2080 Ti" CUDA Driver Version / Runtime Version 11.0 / 10.2 CUDA Capability Major/Minor version number: 7.5 Total amount of global memory: 11017 MBytes (11552096256 bytes) (68) Multiprocessors, ( 64) CUDA Cores/MP: 4352 CUDA Cores GPU Max Clock rate: 1650 MHz (1.65 GHz) Memory Clock rate: 7000 Mhz Memory Bus Width: 352-bit L2 Cache Size: 5767168 bytes Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384) Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 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: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 1024 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 3 copy engine(s) Run time limit on kernels: No Integrated GPU sharing Host Memory: No 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: Yes Supports Cooperative Kernel Launch: Yes Supports MultiDevice Co-op Kernel Launch: Yes Device PCI Domain ID / Bus ID / location ID: 0 / 101 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

試したこと

pyCUDAを使って、dim=27程度、これを1次元配列化してのテストはしました。しかしスレッド数をMAXまで使い切るのがよいのか否か?、"for k in range(j+1,dim)"といった非対称な部分の取り扱いのベストプラクティスは?などと考えているうちに頭が大混乱してしまったので、一度詳しい皆様にお尋ねしたいと考えた次第です。初心者質問で恐縮ですが、何卒よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

deviceQueryの結果:

Maximum number of threads per block: 1024

が示すとおり、blockあたりのthread数は最大1024です。
また、threadの実行効率考慮するとblockあたりのthread数は2のベキ(1024, 512, 256...)が望まれます。

CUDAを使った時パフォーマンスを落とす大きな要因はデバイス(GPU)とホスト(CPU)間のメモリ転送。
これを極力減らす(CPU/GPU間を行ったり来たりしない)、つまり

  • 計算に必要な領域はまとめてGPUに転送しておき
  • 一気にまとめて実行し
  • 最後に結果をCPUに引き戻す

ことが望まれますが、メモリ転送をPythonでどこまで制御できるかは僕はわからんですごめんなさい。
※ 僕はC++でベタ書きするのでメモリ転送のタイミングは僕次第
※ とはいえこのテのことを考慮してると(さくさく書けるってゆー)Pythonのウマミがなくなりますよねー

投稿2020/06/25 05:06

編集2020/06/25 05:17
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goldberg

2020/06/26 10:48

シンプルですが、領域を名一杯使うように、まとめて放り込むのがベストプラクティスなのですね。アドバイスありがとうございます。
episteme

2020/06/26 11:06 編集

CPU-GPU間をデータが行ったり来たりする時間は仕事してませんからね。 一往復で済むならそれに越したことはないっス。 # streamをうまく使えばGPUの計算とメモリ転送を同時にできるんですが、 Pythonでstreamの制御ができるかは知らんです、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問