Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 图形形状对GPU上tensorflow内存分配的影响_Python_Tensorflow_Memory - Fatal编程技术网

Python 图形形状对GPU上tensorflow内存分配的影响

Python 图形形状对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*

当我使用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
字节的一维数组;
(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算法不同。我相信领导者是被阻止的外积矩阵乘法()。使用共享块可以减少跨步内存访问的影响,跨步内存访问只发生在第一次读取时。