【Python】GPUを使ったfor文の解説

【Python】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要素を表示

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です