Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/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
Optimization 任何霓虹灯指令都可以在Cortex A53或A55上通过向量长乘法累加(SMLAL)双重发出?_Optimization_Cpu Architecture_Neon_Micro Optimization_Cortex A - Fatal编程技术网

Optimization 任何霓虹灯指令都可以在Cortex A53或A55上通过向量长乘法累加(SMLAL)双重发出?

Optimization 任何霓虹灯指令都可以在Cortex A53或A55上通过向量长乘法累加(SMLAL)双重发出?,optimization,cpu-architecture,neon,micro-optimization,cortex-a,Optimization,Cpu Architecture,Neon,Micro Optimization,Cortex A,我已经在ARM开发者论坛上问过了,但没有回答 有人知道这是否可能吗?我尝试了几种指令混合: A53 A55 smlal.int8 & 64bit load (ld1) 0.97 1.72 instructions/cycle smlal.int8 & 64bit dup

我已经在ARM开发者论坛上问过了,但没有回答

有人知道这是否可能吗?我尝试了几种指令混合:

                                           A53                A55

smlal.int8 & 64bit load (ld1)              0.97               1.72                   instructions/cycle

smlal.int8 & 64bit dup                     0.97               0.96

smlal.int8 & 64bit or                      0.97               0.96

mla.int8 & 64bit dup                       1.79               1.74

mla.int16 & 64bit dup                      0.97               0.95
Cortex A55优化指南中有相互矛盾的信息


在1处,它表示dual issue=01,据我所知,这意味着它只能在插槽0上发出,但允许在插槽1上发出另一条SIMD指令

在第二位,它表示双重问题=00,这意味着它可以防止双重问题。这是否意味着它同时使用两个插槽

更令人惊讶的是,即使是一个简单的SIMD,也无法并行执行。我真正想做的是使用smlal的双问题dup(特定通道)

发生什么事了?smlal是否同时使用两个SIMD单元

一个建议是,这可能是一个寄存器文件带宽瓶颈

这是有道理的,因为与几乎所有其他指令不同,smlal需要3个操作数并写入2倍宽的输出,而常规mla只进行3次读取和1次写入。在NEON寄存器文件中添加第三个写入端口以支持写入smlal的128位输出和第二条指令的另一个64位输出是非常不合理的

另一种解释是,某些指令不能在每个周期双重发布(即“不能在每个fmla的第4个周期发布矢量负载”)

uint8_t数据[32]___属性(对齐(32));
对于(int i=0;i
您知道内联asm不安全,对吗?您甚至不需要在所使用的向量regs上声明clobber。大概在这个微基准中是可以的“在1个位置,它表示双问题=01,这在我的理解中意味着它只能在插槽0上发出,但允许在第2个位置的插槽1上发出另一条SIMD指令,它表示双问题=00,这意味着它可以防止双问题。这是否意味着它同时使用两个插槽?”一个表是AArch32,另一个是AArch64。你知道内联asm不安全,对吧?您甚至不需要在所使用的向量regs上声明clobber。大概在这个微基准中是可以的“在1个位置,它表示双问题=01,这在我的理解中意味着它只能在插槽0上发出,但允许在第2个位置的插槽1上发出另一条SIMD指令,它表示双问题=00,这意味着它可以防止双问题。这是否意味着它同时使用两个插槽?”一个表是AArch32,另一个是AArch64。
uint8_t data[32] __attribute__((aligned(32)));
for (int i = 0; i < N; i += 16)
{
  asm volatile(
  "smlal v9.8h, v0.8b, v0.8b\n"
  "ld1 {v0.8b},%0\n"
  "smlal v10.8h, v1.8b, v1.8b\n"
  "ld1 {v1.8b},%0\n"      
  "smlal v11.8h, v2.8b, v2.8b\n"
  "ld1 {v2.8b},%0\n"    
  "smlal v12.8h, v3.8b, v3.8b\n"
  "ld1 {v3.8b},%0\n" 
  "smlal v13.8h, v4.8b, v4.8b\n"
  "ld1 {v4.8b},%0\n"    
  "smlal v14.8h, v5.8b, v5.8b\n"
  "ld1 {v5.8b},%0\n"  
  "smlal v15.8h, v6.8b, v6.8b\n"
  "ld1 {v6.8b},%0\n"
  "smlal v0.8h, v7.8b, v7.8b\n"
  "ld1 {v7.8b},%0\n"
  "smlal v1.8h, v8.8b, v8.8b\n"
  "ld1 {v8.8b},%0\n"
  "smlal v2.8h, v9.8b, v9.8b\n"
  "ld1 {v9.8b},%0\n"
  "smlal v3.8h, v10.8b, v10.8b\n"
  "ld1 {v10.8b},%0\n"
  "smlal v4.8h, v11.8b, v11.8b\n"
  "ld1 {v11.8b},%0\n"
  "smlal v5.8h, v12.8b, v12.8b\n"
  "ld1 {v12.8b},%0\n"
  "smlal v6.8h, v13.8b, v13.8b\n"
  "ld1 {v13.8b},%0\n"
  "smlal v7.8h, v14.8b, v14.8b\n"
  "ld1 {v14.8b},%0\n"
  "smlal v8.8h, v15.8b, v15.8b\n"
  "ld1 {v15.8b},%0\n"
  : :"m"(data));

}