【发布时间】:2022-08-19 19:54:43
【问题描述】:
我正在尝试填充某种形状的张量,以使张量使用的总内存始终是 512 的倍数 例如。 SI32 类型的张量形状 16x1x1x4(乘以 4 得到总大小)
The total elements are 16x4x1x1 = 64
Total Memory required 64x**4** = 256 (Not multiple of 512)
Padded shape would be 32x1x1x4 = 512
以下逻辑适用于基本形状,但会与形状中断,例如16x51x1x4 SI32 或者随便说什么80x240x1x1 U8
填充逻辑如下所示
from functools import reduce
DATA_TYPE_MULTIPLYER = 2 # This would change at runtime with different type e.g. 8 with U8 16 with F16 32 with SI32
ALIGNMENT = 512 #Always Constant
CHAR_BIT = 8 # Always Const for given fixed Arch
def approachOne(tensor):
totalElements = reduce((lambda x, y: x * y), tensor)
totalMemory = totalElements * DATA_TYPE_MULTIPLYER
divisor = tensor[1] * tensor[2] * tensor[3]
tempDimToPad = totalElements/divisor
orgDimToPad = totalElements/divisor
while (True):
if ((tempDimToPad * divisor * DATA_TYPE_MULTIPLYER) % ALIGNMENT == 0):
return int(tempDimToPad - orgDimToPad)
tempDimToPad = tempDimToPad + 1;
def getPadding(tensor):
totalElements = reduce((lambda x, y: x * y), tensor)
totalMemory = totalElements * DATA_TYPE_MULTIPLYER
newSize = totalMemory + (ALIGNMENT - (totalMemory % ALIGNMENT))
newTotalElements = (newSize * CHAR_BIT) / (CHAR_BIT * DATA_TYPE_MULTIPLYER)
# Any DIM can be padded, using first for now
paddingValue = tensor[0]
padding = int(((newTotalElements * paddingValue) / totalElements) - paddingValue)
return padding
tensor = [11, 7, 3, 5]
print(getPadding(tensor))
print(approachOne(tensor))
tensorflow 包在这里可能会有所帮助,但我最初是用 C++ 编码的,所以只需在 python 中发布一个最小的工作示例
任何帮助表示赞赏,谢谢
方法一蛮力方法是在任何选定的维度上继续递增 1 并检查 totalMemory 是否是 512 的倍数。蛮力方法有效,但不提供最小填充并且使张量膨胀
更新条件最初的方法是在第一个暗处填充。因为总是填充第一个维度我不是最好的解决方案,只是摆脱这个约束
-
你需要在你的张量中正好有 128 个整数才能有 512 个字节(假设一个整数有 4 个字节),所以这个想法是用更少的整数填充所有张量到那个数字。但是您给出的非工作案例的示例在张量中已经有超过 128 个整数,因此您无法填充它们以达到该数字。
-
@Schnitte 它需要是 512 的倍数。因此,如果所需的 totalMemory 为 800,则填充应该使 totalMemory 调整为 1024
-
@CMouse 有什么限制?我们可以只填充一个维度或任意数量的维度吗?结果是否总是必须是可能的最小尺寸?
标签: python python-3.x