如何使用 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 获得更快的运行时间?的主要内容,如果未能解决你的问题,请参考以下文章