Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用cupy增加内环距离函数_Python_Loops_Cuda_Gpu_Cupy - Fatal编程技术网

Python 用cupy增加内环距离函数

Python 用cupy增加内环距离函数,python,loops,cuda,gpu,cupy,Python,Loops,Cuda,Gpu,Cupy,我试图在迭代内环数组时提高给定距离函数c(x,y)的计算速度。我试图使用cupy和带有随机值的基准测试。到目前为止,我有以下代码: import time import contextlib import cupy as cp import numpy as np squared_diff = cp.ElementwiseKernel( 'float64 x, float64 y', 'float64 z', 'z = (x - y) * (x - y)', '

我试图在迭代内环数组时提高给定距离函数c(x,y)的计算速度。我试图使用cupy和带有随机值的基准测试。到目前为止,我有以下代码:

import time
import contextlib
import cupy as cp
import numpy as np

squared_diff = cp.ElementwiseKernel(
    'float64 x, float64 y',
    'float64 z',
    'z = (x - y) * (x - y)',
    'squared_diff')

 x, y = np.random.randn(1000), np.random.randn(1000)
 x_gpu, y_gpu = cp.random.randn(1000), cp.random.randn(1000)

 c = np.zeros((len(x), len(y)))
 c_gpu = cp.zeros((len(x), len(y)))


 @contextlib.contextmanager
 def timer(message):
     cp.cuda.Stream.null.synchronize()
     start = time.time()
     yield
     cp.cuda.Stream.null.synchronize()
     end = time.time()
     print('%s:  %f sec' % (message, end - start))


with timer(' CPU '):
     for i in range(len(x)):
        for j in range(len(y)):
            c[i, j] = (x[i] - y[i]) ** 2

with timer(' GPU '):
     for i in range(len(x)):
         for j in range(len(y)):
            c_gpu[i, j] = squared_diff(x_gpu[i], y_gpu[j])
然而,与CPU相比,GPU的时间似乎要高得多

CPU :  0.486763 sec
GPU :  26.627597 sec

在考虑使用CUDA提高计算速度背后的理论时,我是否缺少任何重要的提示或问题?

您需要广播输入数组以实现元素级计算

def bcast(x, y, xp):
    return (xp.broadcast_to(x[:, None], (1000, 1000)),
            xp.broadcast_to(y, (1000, 1000)))

x, y = bcast(x, y, np)
with timer(' CPU '):
    c = (x - y) ** 2

x_gpu, y_gpu = bcast(x_gpu, y_gpu, cp)
with timer(' GPU '):
    c_gpu2 = squared_diff(x_gpu, y_gpu)

如果我正确地阅读了代码(直到60秒前我才知道cupy是什么),那么每次调用中只有一个元素的elementwise内核不是有效地调用了1000000次吗?如果是这样的话,那绝对不是一个非常明智的方法GPU@talonmies:谢谢你的回复。我正在努力寻找解决办法,我想我可以同意你的看法。这似乎是主要的开销。你有什么建议我如何提高这个案例的绩效?看起来这个操作应该是并行的,因为所有的“单元”都是相互独立的。我还注意到你的GPU和CPU版本不做相同的操作either@talonmies你能详细说明一下吗?手术看起来和我很相似。很相似不是一回事。仔细查看主机代码