Python 图形形状对GPU上tensorflow内存分配的影响
当我使用tensorflow在nvidia GPU上创建一个带有shapePython 图形形状对GPU上tensorflow内存分配的影响,python,tensorflow,memory,Python,Tensorflow,Memory,当我使用tensorflow在nvidia GPU上创建一个带有shape(L,N,N)的变量时,该变量是否占用一个由L个方形块组成的平铺,其中每个块都是N x N 例如,拼接在一起的三块方形内存将是: # --- # | NxN | # --- # | NxN | # --- # | NxN | # --- # tensorflow如何为形状为(a,b,N,N)的变量分配GPU内存?GPU上的内存被分配为一维字节数组,如果可能,可以对齐。在您的示例中,具有形状(L,N,N)的张量将是大小8*
(L,N,N)
的变量时,该变量是否占用一个由L个方形块组成的平铺,其中每个块都是N x N
例如,拼接在一起的三块方形内存将是:
# --- #
| NxN |
# --- #
| NxN |
# --- #
| NxN |
# --- #
tensorflow如何为形状为
(a,b,N,N)
的变量分配GPU内存?GPU上的内存被分配为一维字节数组,如果可能,可以对齐。在您的示例中,具有形状(L,N,N)
的张量将是大小8*L*N*N
字节的一维数组;(a,b,N,N)
大小写将是8*a*b*N*N
字节,假设float64
值
您可以通过阅读TensorFlow源代码来了解这一点:
- 使用
声明void*AllocateRaw(大小对齐,大小num字节)
类,该类在中实现GPUcudaMallocAllocator
- 声明
类,它是Allocator
的父类,该类声明GPUcudaMallocAllocator
李>void*AllocateRaw(大小对齐,大小num字节)
由于这些
AllocateRaw
函数采用单一大小,因此所有TensorFlow内存都分配在引擎盖下的一维阵列中。这在实践中很常见,因为很容易将高阶数组表示映射到连续的1-D内存块上,并且可以最大限度地提高设备上和设备上的传输吞吐量。GPU上的内存被分配为一维字节数组,如果可能,可以对齐。在您的示例中,具有形状(L,N,N)
的张量将是大小8*L*N*N
字节的一维数组;(a,b,N,N)
大小写将是8*a*b*N*N
字节,假设float64
值
您可以通过阅读TensorFlow源代码来了解这一点:
- 使用
声明void*AllocateRaw(大小对齐,大小num字节)
类,该类在中实现GPUcudaMallocAllocator
- 声明
类,它是Allocator
的父类,该类声明GPUcudaMallocAllocator
李>void*AllocateRaw(大小对齐,大小num字节)
由于这些
AllocateRaw
函数采用单一大小,因此所有TensorFlow内存都分配在引擎盖下的一维阵列中。这在实践中很常见,因为很容易将高阶数组表示映射到连续的1-D内存块上,并且可以最大限度地提高设备上和设备上的传输吞吐量。感谢您深入了解了这么多细节。如果这两个矩阵在GPU上被分配为一块正方形内存,我们会更快地进行矩阵乘法吗?对于CPU,我记得如果矩阵中的一个在乘法之前被转置,那么矩阵乘法会更快。将2D矩阵存储为1D数组意味着沿矩阵的行或列进行的内存访问速度加快。。。所有乘法运算可能在GPU上同时发生。所以我猜跨步访问并没有那么糟糕,因为所有的访问实际上都是同时进行的。GPU上矩阵乘法的最佳算法与CPU算法不同。我相信领导者是被阻止的外积矩阵乘法()。共享块的使用减少了跨步内存访问的影响,这只发生在第一次读取时。感谢您深入了解这么多细节。如果这两个矩阵在GPU上被分配为一块正方形内存,我们会更快地进行矩阵乘法吗?对于CPU,我记得如果矩阵中的一个在乘法之前被转置,那么矩阵乘法会更快。将2D矩阵存储为1D数组意味着沿矩阵的行或列进行的内存访问速度加快。。。所有乘法运算可能在GPU上同时发生。所以我猜跨步访问并没有那么糟糕,因为所有的访问实际上都是同时进行的。GPU上矩阵乘法的最佳算法与CPU算法不同。我相信领导者是被阻止的外积矩阵乘法()。使用共享块可以减少跨步内存访问的影响,跨步内存访问只发生在第一次读取时。