【Python】GPUを使ったfor文の解説
- GPUを使ったfor文とは?
- なぜGPUを使うのか?
- Numbaを使ったGPU並列for文
- CuPyを使ったGPU並列for文
- PyTorchを使ったGPU並列for文
- TensorFlowを使ったGPU並列for文
- GPUを使ったfor文の適用例
GPUを使ったfor文とは?
Pythonでループ処理を高速化する方法の一つに、GPU(Graphics Processing Unit)を利用する方法があります。通常のPythonのfor文はCPU上で順番に処理されますが、GPUを活用することで並列処理が可能になり、処理速度が大幅に向上します。
なぜGPUを使うのか?
GPUは、多数のスレッドを並列に実行できるため、以下のような場面で有効です。
- 大規模なデータを処理する場合(行列計算、シミュレーション、画像処理など)
- ニューラルネットワークなどの機械学習タスク
- 物理シミュレーションや数値計算
Pythonでは、CUDAを利用したライブラリを活用することで、GPUを簡単に利用できます。
Numbaを使ったGPU並列for文
Numbaは、PythonコードをJIT(Just-In-Time)コンパイルし、高速化するライブラリです。特にCUDAを利用してGPU並列処理を行うための@cuda.jit
デコレーターが提供されています。
Numbaを使った基本的なfor文のGPU実装
from numba import cuda
import numpy as np
@cuda.jit
def gpu_for_loop(arr):
idx = cuda.grid(1) # 各スレッドのインデックス
if idx < arr.size:
arr[idx] *= 2 # 各要素を2倍にする
# 配列の準備
n = 1000000
arr = np.arange(n, dtype=np.float32)
d_arr = cuda.to_device(arr)
# GPUで処理
gpu_for_loop.forall(n)(d_arr)
# 結果を取得
arr_result = d_arr.copy_to_host()
print(arr_result[:10]) # 最初の10要素を表示
CuPyを使ったGPU並列for文
CuPyは、NumPyと互換性のあるライブラリで、GPUを利用した配列演算が可能です。
CuPyを使ったGPU並列処理
import cupy as cp
# CuPyの配列を作成
arr = cp.arange(1000000, dtype=cp.float32)
# for文の代わりにベクトル化演算
arr *= 2
# 結果を取得
print(cp.asnumpy(arr[:10])) # 最初の10要素を表示
PyTorchを使ったGPU並列for文
PyTorchでは、GPUを活用したテンソル演算が可能です。
PyTorchを使ったGPU処理
import torch
# GPUが利用可能か確認
device = "cuda" if torch.cuda.is_available() else "cpu"
# テンソルの作成
arr = torch.arange(1000000, dtype=torch.float32, device=device)
# GPU上で処理
arr *= 2
# 結果を取得
print(arr[:10].cpu().numpy()) # 最初の10要素を表示
TensorFlowを使ったGPU並列for文
TensorFlowでは、GPUを活用した演算が可能です。
TensorFlowを使ったGPU処理
import tensorflow as tf
# TensorFlowのテンソル作成
arr = tf.Variable(tf.range(1000000, dtype=tf.float32))
# GPU上で処理
arr.assign(arr * 2)
# 結果を取得
print(arr.numpy()[:10]) # 最初の10要素を表示
GPUを使ったfor文の適用例
画像処理
画像のピクセルごとの計算を高速化できます。
import cupy as cp
# 画像データをCuPyで処理
image = cp.random.rand(1000, 1000, 3) # 1000x1000のRGB画像
image *= 255 # ピクセル値を調整
print(image[:2, :2, :]) # 最初の2x2ピクセルを表示
数値計算(行列積)
行列の積をGPUで高速計算できます。
import cupy as cp
A = cp.random.rand(1000, 1000)
B = cp.random.rand(1000, 1000)
# GPUで行列積
C = cp.dot(A, B)
print(C[:2, :2]) # 最初の2x2要素を表示
物理シミュレーション
粒子の運動をシミュレーションできます。
from numba import cuda
import numpy as np
@cuda.jit
def update_positions(x, v, dt):
idx = cuda.grid(1)
if idx < x.size:
x[idx] += v[idx] * dt
n = 1000000
x = np.random.rand(n)
v = np.random.rand(n)
d_x = cuda.to_device(x)
d_v = cuda.to_device(v)
# GPUで更新
update_positions.forall(n)(d_x, d_v, 0.1)
x_result = d_x.copy_to_host()
print(x_result[:10]) # 最初の10要素を表示