为什么这个Python脚本在CPU中比在GPU中运行得更快?

为什么这个Python脚本在CPU中比在GPU中运行得更快?,python,parallel-processing,gpu,self-organizing-maps,Python,Parallel Processing,Gpu,Self Organizing Maps,我正在使用Python的库somoclu来训练使用Python的自组织映射。该库允许用户在CPU(Intel Core i7-8700)或GPU(GeForce GTX 1080 Ti)上执行培训 我注意到CPU运行脚本的速度比GPU快,所以我运行了一次扫描,改变了数据点的数量和映射的大小,以查看GPU是否在某个点上优于CPU。这就是剧本: import numpy as np import somoclu import time m = 3 # Number of dimensions po

我正在使用Python的库
somoclu
来训练使用Python的自组织映射。该库允许用户在CPU(Intel Core i7-8700)或GPU(GeForce GTX 1080 Ti)上执行培训

我注意到CPU运行脚本的速度比GPU快,所以我运行了一次扫描,改变了数据点的数量和映射的大小,以查看GPU是否在某个点上优于CPU。这就是剧本:

import numpy as np
import somoclu
import time

m = 3 # Number of dimensions
points = [5000, 30000, 80000, 150000, 300000] # Number of datapoints
iterMax = 200 # Max number of iterations
mapSize = [4, 32, 64, 128] # Dimensions of SOM
np.random.seed(0)
#%% SOM
for n in points:
    for size in mapSize:
        y = np.random.rand(n,m) # Input data
        # With CPU
        t = time.clock() # Start time
        som = somoclu.Somoclu(size,
                              size,
                              compactsupport = False,
                              kerneltype = 0)
        som.train(y.astype(np.float32), epochs = iterMax)
        elapsedTime = time.clock() - t
        # With GPU
        t = time.clock() # Start time
        som = somoclu.Somoclu(size,
                              size,
                              compactsupport = False,
                              kerneltype = 1)
        som.train(y.astype(np.float32), epochs = iterMax)
        elapsedTime = time.clock() - t
我将时间保存在CSV中,这是我得到的:

CPU                 GPU
2.7632589999999997  5.935387999999999
60.340638           82.796062
228.292085          305.75625900000006
861.3243            1141.331934
11.692982999999913  24.568256999999903
330.17140100000006  443.82112400000005
1354.677431         1749.3110039999992
5559.308704         6990.034151000002
29.3726179999976    47.36881999999969
913.3250950000001   1163.5942189999987
3703.653313999999   4615.292857
14868.418703000003  18635.051464000004
37.40133600000263   68.64375999999902
1699.020611         2141.047305
6925.692426000009   8645.564134
27887.844171999997  illegal memory access was encountered
正如您所看到的,CPU在每种情况下都优于GPU(最重要的是,当运行具有150000个数据点和64x64映射的脚本时,GPU版本崩溃)。这怎么可能?那么,使用GPU训练SOM的优势是什么

编辑:

我在R中尝试了相同的库,在这种语言中GPU的性能优于CPU。显然这只是Python的一个问题,但我不擅长编程来弄清楚发生了什么。我相信运行的内核是一样的,所以只是界面发生了变化。让我们看看这是否有助于人们找到为什么在Python中CPU比GPU快。

根据中的图5,GPU更快。然而,该文件没有显示广泛的基准。我只能建议,对于您的机器,CPU的功能更强。但是你可以研究这篇论文来做一个更相似的对比测试

为了确保结果的可复制性,我们公开使用 AmazonWeb服务提供的可用群集GPU实例。这个 实例类型为cg1.4XL (),配备22个GiB的 内存、两个IntelXeon X5570四核CPU和两个NVIDIA Tesla M2050 GPU,运行Ubuntu 12.04

(16) Somoclu:用于自组织地图的高效并行库,可从以下网站获得:


似乎您的CPU和GPU都比AWS基准测试更强大。

您的脚本所涉及的并行度是多少?@abc我不确定我能否回答这个问题。我只是在使用上面提到的库,我的脚本非常简单,如图所示。我相信在somoclu的函数中涉及到并行性,用户无法控制它。我认为这与此无关,但
time.clock
是一种不好的代码基准测试方法。如果您可以使用
timeit
,请使用它;如果你不能,你必须自己做它的大部分工作(包括使用正确的时钟,这很少是
时钟,禁用GC等等)。与此同时,我对这个库一无所知,但是
iterMax=200
是一个合理的值,还是一个非常小的值,或者…?这就是为什么我说“我认为这与此无关”。当人们发帖问为什么一个函数需要117ns,而另一个函数需要141ns,并且他们使用
时钟
来计时单个迭代时,答案通常是“不要使用
时钟
”,但当你谈论3秒以上的工作循环时,通常不是这样。但是,做对总比做错并假设它可能没问题要好。我在我的电脑上运行了相同的模拟,得到了与问题相同的结果(CPU的性能优于GPU)。唯一可能不一样的是迭代次数,正如我所注意到的,在论文中没有说明。但是mapsize和输入数据维度是相同的(分别为50x50和1000)。