[ 
https://issues.apache.org/jira/browse/HIVE-10180?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14392166#comment-14392166
 ] 

Chengxiang Li commented on HIVE-10180:
--------------------------------------

This is one loop part's assembly code of DoubleColAddDoubleColumn printed 
during execution:
Without patch
{noformat}
 0x00007f1a6b003053: mov    $0x80000000,%r8d
  0x00007f1a6b003059: cmp    %ecx,%r9d
  0x00007f1a6b00305c: cmovl  %r8d,%ecx
  0x00007f1a6b003060: cmp    %ecx,%r10d
  0x00007f1a6b003063: jge    0x00007f1a6b003128
  0x00007f1a6b003069: nopl   0x0(%rax)          ;*aload
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@269
 (line 93)

  0x00007f1a6b003070: vmovsd 0x10(%r14,%r10,8),%xmm0
  0x00007f1a6b003077: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b00307e: vmovsd %xmm0,0x10(%rdi,%r10,8)
  0x00007f1a6b003085: movslq %r10d,%r8
  0x00007f1a6b003088: vmovsd 0x18(%r14,%r8,8),%xmm0
  0x00007f1a6b00308f: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b003096: vmovsd %xmm0,0x18(%rdi,%r8,8)
  0x00007f1a6b00309d: vmovsd 0x20(%r14,%r8,8),%xmm0
  0x00007f1a6b0030a4: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b0030ab: vmovsd %xmm0,0x20(%rdi,%r8,8)
  0x00007f1a6b0030b2: vmovsd 0x28(%r14,%r8,8),%xmm0
  0x00007f1a6b0030b9: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b0030c0: vmovsd %xmm0,0x28(%rdi,%r8,8)
  0x00007f1a6b0030c7: vmovsd 0x30(%r14,%r8,8),%xmm0
  0x00007f1a6b0030ce: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b0030d5: vmovsd %xmm0,0x30(%rdi,%r8,8)
  0x00007f1a6b0030dc: vmovsd 0x38(%r14,%r8,8),%xmm0
  0x00007f1a6b0030e3: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b0030ea: vmovsd %xmm0,0x38(%rdi,%r8,8)
  0x00007f1a6b0030f1: vmovsd 0x40(%r14,%r8,8),%xmm0
  0x00007f1a6b0030f8: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b0030ff: vmovsd %xmm0,0x40(%rdi,%r8,8)
  0x00007f1a6b003106: vmovsd 0x48(%r14,%r8,8),%xmm0
  0x00007f1a6b00310d: vaddsd 0x10(%r12,%r11,8),%xmm0,%xmm0
  0x00007f1a6b003114: vmovsd %xmm0,0x48(%rdi,%r8,8)  ;*dastore
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@283
 (line 93)

  0x00007f1a6b00311b: add    $0x8,%r10d         ;*iinc
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@284
 (line 92)

  0x00007f1a6b00311f: cmp    %ecx,%r10d
  0x00007f1a6b003122: jl     0x00007f1a6b003070  ;*if_icmpeq
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@266
 (line 92)
{noformat}
With patch
{noformat}
0x00007f13d2e6af95: cmp    %r8d,%r10d
  0x00007f13d2e6af98: cmovl  %r11d,%r8d
  0x00007f13d2e6af9c: cmp    %r8d,%eax
  0x00007f13d2e6af9f: jge    0x00007f13d2e6afdd
  0x00007f13d2e6afa1: vpshufd $0x44,%xmm0,%xmm1
  0x00007f13d2e6afa6: vinsertf128 $0x1,%xmm1,%ymm1,%ymm1
  0x00007f13d2e6afac: nopl   0x0(%rax)          ;*aload
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@273
 (line 94)

  0x00007f13d2e6afb0: vmovdqu 0x10(%rsi,%rax,8),%ymm2
  0x00007f13d2e6afb6: vaddpd %ymm1,%ymm2,%ymm2
  0x00007f13d2e6afba: movslq %eax,%r10
  0x00007f13d2e6afbd: vmovdqu 0x30(%rsi,%r10,8),%ymm3  ;*daload
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@283
 (line 94)

  0x00007f13d2e6afc4: vmovdqu %ymm2,0x10(%rdx,%rax,8)
  0x00007f13d2e6afca: vaddpd %ymm1,%ymm3,%ymm2
  0x00007f13d2e6afce: vmovdqu %ymm2,0x30(%rdx,%r10,8)  ;*dastore
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@285
 (line 94)

  0x00007f13d2e6afd5: add    $0x8,%eax          ;*iinc
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@286
 (line 93)

  0x00007f13d2e6afd8: cmp    %r8d,%eax
  0x00007f13d2e6afdb: jl     0x00007f13d2e6afb0  ;*if_icmpeq
                                                ; - 
org.apache.hadoop.hive.ql.exec.vector.expressions.gen.DoubleColAddDoubleColumn::evaluate@270
 (line 93)
{noformat}
As you can see, the load, calculate and store instruction are changed from 
scalar manipulation instructions to packed manipulation instructions.
Environment:
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz
CentOS6.2

> Loop optimization in ColumnArithmeticColumn.txt
> -----------------------------------------------
>
>                 Key: HIVE-10180
>                 URL: https://issues.apache.org/jira/browse/HIVE-10180
>             Project: Hive
>          Issue Type: Sub-task
>            Reporter: Chengxiang Li
>            Assignee: Chengxiang Li
>            Priority: Minor
>         Attachments: HIVE-10180.1.patch
>
>
> JVM is quite strict on the code schema which may executed with SIMD 
> instructions, take a loop in DoubleColAddDoubleColumn.java for example, 
> {code:java}
> for (int i = 0; i != n; i++) {
>   outputVector[i] = vector1[0] + vector2[i];
> }
> {code}
> The "vector1[0]" reference would prevent JVM to execute this part of code 
> with vectorized instructions, we need to assign the "vector1[0]" to a 
> variable outside of loop, and use that variable in loop.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to