如何使用 GPU 获得更快的运行时间?

Posted

技术标签:

【中文标题】如何使用 GPU 获得更快的运行时间?【英文标题】:How to use the GPU for faster runtime? 【发布时间】:2022-01-23 22:45:51 【问题描述】:

我正在尝试实现 Arnold Cat Map 算法来加密图像。我已经做到了,但我也想在 GPU 上尝试一下,看看速度上的差异。根据我的搜索,似乎我必须使用 Numba、PyTorch、Cupy 库才能使其在 GPU 上运行。我尝试过使用 numba 和 PyTorch,但我认为我做得不对。

如果您能指导我找到解决方案,它将对我有很大帮助!

谢谢

import cv2
from numba import jit
import numpy as np
import time
import torch

def transform(img, num):

rows, cols, ch = img.shape
if (rows == cols):
    n = rows
    img2 = np.zeros([rows, cols, ch])
    for x in range(0, rows):
        for y in range(0, cols):

            img2[x][y] = img[(x+y)%n][(x+2*y)%n]
    cv2.imwrite("C:\\Users\Iani\Desktop\imagine2.jpg", img2)
    return img2

else:
    print("The image is not square.")

def run():
   img = cv2.imread('C:\\Users\Iani\Desktop\imagine.png')
   for i in range (1,26):
      img = transform(img, i)


if __name__ == "__main__":
    start = time.time()
    run()
    end = time.time()
    print("Rularea a durat 0".format(end - start))

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

无论您使用 Numba 还是 CuPy,目标都是一样的:通过并行工作来加速 NumPy 解决方案。 np.zeros 电话不会成为问题。这是所有这些单独的像素操作。你并没有真正在那里使用 NumPy。它只是一次复制一个像素。

在这种特殊情况下,您似乎需要“跨步技巧”。具体来说,我认为您需要numpy.lib.stride_tricks.as_strided(x, shape, strides, subok=False, writeable=False)strides,这样img2 是生成的临时视图的方形子集。查看***,我认为shape 需要是[N*3, N*2]

然后,您可以转到 cupy.lib.stride_tricks.as_strided 以查看 CuPy 是否使其更快。

【讨论】:

抱歉,圣诞节等迟到了。我不明白:“认为形状需要是 [N*3, N*2]”。根据我的阅读,形状属性为我们提供了行数和列数。因为我的算法只适用于方形图像,所以shape属性的输入不应该是原始图像的行数和列数吗?我没有时间编写您的解决方案,但我想确保我理解您的建议。谢谢! @NurciIani:想法是首先展开右下角的正方形,然后展开使其更大。

以上是关于如何使用 GPU 获得更快的运行时间?的主要内容,如果未能解决你的问题,请参考以下文章

让GPU跑的更快

如何在 AMD GPU 上运行 Python?

OpenGL:如何获得 GPU 使用百分比?

如何对 INTEL GPU 进行编程

如何在 Google Colab 中获得分配的 GPU 规格

如何在 Alea 中使用/转换 C# 类?