トップQs
タイムライン
チャット
視点

CuPy

ウィキペディアから

Remove ads

CuPyは、PythonでのGPUを使用した数値計算のためのオープンソースライブラリである。多次元配列、疎行列、それらを基盤としたさまざまな数値計算アルゴリズムに対応している[4]。CuPyはNumPyおよびSciPyと同じAPIセットを共有しており、NumPyやSciPyのコードをGPU上で実行するために置き換えて使用できる。CuPyはNVIDIA CUDAAMDのROCmに対応している[5][6]

概要 開発元, 初版 ...

CuPyは当初、ディープラーニングフレームワークのChainerのバックエンドとして開発され、2017年に独立したプロジェクトとなった[7]

Remove ads

要約
視点

配列作成

>>> import cupy as cp
>>> x = cp.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = cp.arange(10)
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

基本的操作

>>> import cupy as cp
>>> x = cp.arange(12).reshape(3, 4).astype(cp.float32)
>>> x
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]], dtype=float32)
>>> x.sum(axis=1)
array([ 6., 22., 38.], dtype=float32)

生の CUDA C++ カーネル

import cupy as cp

multiply_elementwise = cp.RawKernel(r'''
    extern "C" __global__
    void multiply_elementwise(const float A[4][4], const float B[4][4], float C[4][4]) {
        int y = threadIdx.y + blockIdx.y * blockDim.y;
        int x = threadIdx.x + blockIdx.x * blockDim.x;
        C[y][x] = A[y][x] * B[y][x];
    }
''', 'multiply_elementwise')
A = cp.arange(4 * 4, dtype=cp.float32).reshape(4, 4)
B = A
C = cp.zeros(A.shape, dtype=cp.float32)
multiply_elementwise((1, 1), A.shape, (A, B, C))  # ブロック数, ブロックあたりのスレッド数, 引数
print(C)  # C = A * B

上記の例はCUDAカーネルのC++の部分をPythonで書くことも出来る。

from cupyx import jit

@jit.rawkernel()
def multiply_elementwise(A, B, C):
    y, x = jit.grid(2)
    C[y, x] = A[y, x] * B[y, x]
Remove ads

関連項目

出典

外部リンク

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads