- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
cuda.local.array()
在 How is performance affected by using numba.cuda.local.array() compared with numba.cuda.to_device()?简单快速排序算法的基准测试表明,使用 to_device
传递预分配数组的效率可以提高约 2 倍,但这需要更多内存。
分别对 2,000,000 行、每行 100 个元素进行排序的基准结果如下:
2000000
Elapsed (local: after compilation) = 4.839058876037598
Elapsed (device: after compilation) = 2.2948694229125977
out is sorted
Elapsed (NumPy) = 4.541851282119751
to_device()
的虚拟示例
cuda.local.array()
调用,相当于
to_device
版本可能开始看起来像这样并且变得非常麻烦:
def foo2(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, out):
for i in range(len(var1)):
out[i] = foo(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, out)
def foo3(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, out):
idx = cuda.grid(1)
foo(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, out[idx])
在真实的代码库中,可能有 3-4 层函数嵌套在数十个函数和数百到数千行代码中。
这两种方法的替代方案是什么?
最佳答案
备择方案
这里有一些替代方案 cuda.local.array()
并通过 cuda.to_device()
单独传递参数:
local_args
),它实际上代表了 15 个变量。这样做的缺点是需要不断地对其进行切片,并希望您不会意外地使用来自不同“子变量”的索引或通过稍后添加新变量、更改大小等来破坏排序。cuda.jit()
, CuPy cupy.fuse()
调用和/或其他 CUDA 实现。例如,如果您对一组向量进行操作,否则这些操作将在成对距离矩阵计算中(例如 10,0002 次而不是 10,000 次)重复(昂贵且冗余)多次,然后考虑预先执行这些操作并通过它们作为参数(可以与 1. 或 3. 组合)dtype
,尽管这可能会导致 issues with the NVCC compiler (希望永久修复)。 GitHub issue有一个例子如下:import numpy as np
np_int = np.int32
np_float = np.float32
cuda_const_arrays_type = np.dtype([
('a1', (np_int,(7776, 13))),
('a2', (np_int,(7776, 2, 5))),
('a3', (np_int,(16494592))),
('a4', (np_int,13)),
('a5', (np_float,(22528, 64))),
('a6', (np_int,(522523, 64))),
('a7', (np_int,(32,5))),
('a8', (np_int,(66667))),
('a9', (np_int,(252, 64, 3, 2, 2, 2, 2, 2, 2, 13))),
('a10', (np_int,(7776)))
])
cuda_const_arrays = np.zeros(1, dtype=cuda_const_arrays_type)
for txt in cuda_const_arrays_type.names: # i.e. ("a1", "a2", ...)
cuda_const_arrays[0][txt] = np.loadtxt(open(txt+".csv", "rb"), delimiter=",", skiprows=1)
gpu_const_arrays = cuda.to_device(cuda_const_arrays[0])
@cuda.jit(device=True)
def cuda_doSomething(gpu_const_arrays,...):
gpu_const_arrays.a1
可以在
Gitlab 上找到来自同一用户的示例。 (确定删除
import keras as ks
行)。虽然这会导致以前 Numba 版本的偶发错误,但它对
numba 0.53.1
工作正常和
cudatoolkit 11.2.2
,表明“自定义数据类型”方法可能是
OK now .
dtype
中仅传递参数的子集可能是合适的。 ,但我不知道如何做到这一点。
关于python - 什么是 numba.cuda.local.array() 的有效替代方案,它们不像通过 to_device() 传递许多参数那么麻烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68870324/
我想将一个类对象传递给一个函数。我可以让它工作,但我想知道是否有我可以分配的类型?我有一个我正在尝试做的“最小”示例。 spec = [("a", float64),("b",float64)] @j
我有一个简单的函数来对扑克手牌进行排序(手牌是字符串)。 我用 rA,rB = rank(a),rank(b) 调用它,这是我的实现。没有 @jit(nopython=True) 也能很好地工作,但是
我在这里有一个简单的例子来帮助我理解使用 numba 和 cython。我是 numba 和 cython 的新手。我已经尽力结合所有技巧来使 numba 更快,并且在某种程度上,cython 也是如
我正在使用 numbas @jit 装饰器在 python 中添加两个 numpy 数组。如果我使用 @jit 与 python 相比,性能是如此之高。 然而,即使我传入 @numba.jit(nop
我需要为通用指标构建相异矩阵。由于我需要算法快速运行,所以我在 nopython 模式下使用了 numba 0.35。这是我的代码 import numpy as np from numba impo
Numba Cuda 有 syncthreads() 来同步一个 block 中的所有线程。如何在不退出当前内核的情况下同步网格中的所有 block ? 在 C-Cuda 中有一个 cooperati
有人尝试在Google合作伙伴中使用numba吗?我只是不知道如何在此环境中进行设置。 此刻,我陷入了错误library nvvm not found。 最佳答案 将此代码复制到单元格中。这个对我有用
我想编写一个函数,它既可以作为 jitted 函数运行,也可以作为普通 python 或对象模式 numba 运行,具体取决于 numba 是否能够进行类型推断。我实际上更喜欢普通的 python,但
我有一个非常简单的问题我无法解决。 我正在使用 Numba 和 Cuda。我有一个列表 T=[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] 我想要一个包含列表元素的元组,如
我正在测试一些采用 numpy 数组的函数的 numba 性能,并比较: import numpy as np from numba import jit, vectorize, float64 im
我正在使用 Scipy 的 interpolate.interp1d 在 Python3 中插入一维数组。我想将它与 numba 一起使用,但不支持 scipy 和此功能。是否有 numba 支持
我是 Numba 的新手,我正在尝试使用 Numba(版本 0.54.1)在 Python 中实现旧的 Fortran 代码,但是当我添加 parallel = True 时,程序实际上变慢了.我的程
我需要在 Python 中创建一个位数组。到目前为止,我发现可以使用 bitarray 生成非常节省内存的数组。模块。 然而,我的最终目的是使用来自Numba 的@vectorize 装饰器。 . N
我认为这是一个简单的问题,但我发现 numba 文档缺乏关于如何将字符串类型与 numpy 数组和字典一起使用的信息。我有一个我想使用 numba 的函数,它需要一个邮政编码列表,然后是一个映射邮政编
假设我有两个功能 def my_sub1(a): return a + 2 def my_main(a): a += 1 b = mysub1(a) return b
在以下用于逻辑比较的 numba 编译函数中,性能下降的原因可能是什么: from numba import njit t = (True, 'and_', False) #@njit(boolean
我的代码使用如下列表的笛卡尔积: import itertools cartesian_product = itertools.product(list('ABCDEF'), repeat=n) n可
我正在使用 Numba(版本 0.37.0)来优化 GPU 代码。我想使用组合矢量化函数(使用 Numba 的 @vectorize 装饰器)。 导入和数据: import numpy as np f
我想知道在 numba 函数中计算两个列表的交集的最快方法。只是为了澄清:两个列表的交集示例: Input : lst1 = [15, 9, 10, 56, 23, 78, 5, 4, 9] lst2
我正在使用 Numba 非 python 模式和一些 NumPy 函数。 @njit def invert(W, copy=True): ''' Inverts elementwise
我是一名优秀的程序员,十分优秀!