Почему dask не возвращает ничего в функции CUDA? - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь наложить слой dask поверх моих функций cuda, но когда dask возвращается, я получаю объект NoneType.

from numba import cuda
import numpy as np
from dask.distributed import Client, LocalCluster


@cuda.jit()
def addingNumbersCUDA (big_array, big_array2, save_array):
    i = cuda.grid(1)
    if i < big_array.shape[0]:
        for j in range (big_array.shape[1]):
            save_array[i][j] = big_array[i][j] * big_array2[i][j]


if __name__ == "__main__":
    cluster = LocalCluster()
    client = Client(cluster)


    big_array = np.random.random_sample((100, 3000))
    big_array2  = np.random.random_sample((100, 3000))
    save_array = np.zeros(shape=(100, 3000))


    arraysize = 100
    threadsperblock = 64
    blockspergrid = (arraysize + (threadsperblock - 1))

    x = client.submit(addingNumbersCUDA[blockspergrid, threadsperblock], big_array, big_array2, save_array)


    y = client.gather(x)
    print(y)

Я понимаю, что вы на самом деле не возвращаете функцию cuda ичто результаты возвращаются обратно в массив, который вы вызывали. Поэтому я получаю noneType или потому, что я использую dask неправильно для cuda?

1 Ответ

0 голосов
/ 28 мая 2019

Как указано в этом вопросе: Как использовать Dask для запуска кода Python на графическом процессоре? от Мэтью Роклина, dask не может обрабатывать операции на месте. Чтобы учесть это, было бы лучше добавить дополнительную функцию, которая обрабатывает код gpu.

from numba import cuda
import numpy as np
from dask.distributed import Client, LocalCluster


@cuda.jit()
def addingNumbersCUDA (big_array, big_array2, save_array):
    i = cuda.grid(1)
    if i < big_array.shape[0]:
        for j in range (big_array.shape[1]):
            save_array[i][j] = big_array[i][j] * big_array2[i][j]

def toCUDA (big_array, big_array2, save_array):
    arraysize = 100
    threadsperblock = 64
    blockspergrid = (arraysize + (threadsperblock - 1))

    d_big_array = cuda.to_device(big_array)
    d_big_array2 = cuda.to_device(big_array2)
    d_save_array = cuda.to_device(save_array)

    addingNumbersCUDA[blockspergrid, threadsperblock](d_big_array, d_big_array2, d_save_array)

    save_array = d_save_array.copy_to_host()
    return save_array

if __name__ == "__main__":
    cluster = LocalCluster()
    client = Client(cluster)

    big_array = np.random.random_sample((100, 3000))
    big_array2  = np.random.random_sample((100, 3000))
    save_array = np.zeros(shape=(100, 3000))

    x = client.submit(toCUDA, big_array, big_array2, save_array)


    y = client.gather(x)
    print(y)
...