<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Chris, in Intel® Fortran Compiler</title>
    <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121895#M131908</link>
    <description>&lt;P&gt;Chris,&lt;/P&gt;

&lt;P&gt;Experiment with something like this:&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;program main
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use ifport
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer, parameter :: n1=10000, n2=5000
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:,:) :: x1,x2, x1x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer, allocatable, dimension(:,:) :: idx
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:,:,:) :: x3, x4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real :: stime, ftime
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: i,j,k

&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(x1(n1,n2) ,x2(n1,n2), x1x2(n1,n2), idx(n1,n2))
&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(x3(n1,n2,4), x4(n1,n2,4))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j = 1, n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i = 1, n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x1(i,j) = (2.*rand()-1.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x2(i,j) = (2.*rand()-1.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3 =0.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4 =0.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where((x1.gt.0.).and.(x2.gt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,1) = x3(:,:,1) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.lt.0.).and.(x2.gt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,2) = x3(:,:,2) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.lt.0.).and.(x2.lt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,3) = x3(:,:,3) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.gt.0.).and.(x2.lt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,4) = x3(:,:,4) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end where
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time ', ftime-stime

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1,n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=1,n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((x1(i,j).gt.0.).and.(x2(i,j).gt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,1) = x4(i,j,1) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).lt.0.).and.(x2(i,j).gt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,2) = x4(i,j,2) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).lt.0.).and.(x2(i,j).lt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,3) = x4(i,j,3) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).gt.0.).and.(x2(i,j).lt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,4) = x4(i,j,4) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time2 ', ftime-stime
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x1x2 = x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx = (int(sign(1.0,x1)+sign(2.0,x2))+5)/2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! *** note the quanrant indexes differ
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int +5 /2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! ge ge&amp;nbsp; 1+2&amp;nbsp; 3&amp;nbsp;&amp;nbsp; 8&amp;nbsp; 4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! lt ge -1+2&amp;nbsp; 1&amp;nbsp;&amp;nbsp; 6&amp;nbsp; 3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! lt lt -1-2 -3&amp;nbsp;&amp;nbsp; 2&amp;nbsp; 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! ge lt&amp;nbsp; 1-2 -1&amp;nbsp;&amp;nbsp; 4&amp;nbsp; 2

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1,n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=1,n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,idx(i,j)) = x4(i,j,idx(i,j)) + x1x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time3 ', ftime-stime

end program
&lt;/PRE&gt;

&lt;PRE class="brush:plain;"&gt;&amp;nbsp;time&amp;nbsp;&amp;nbsp; 0.9204060
&amp;nbsp;time2&amp;nbsp;&amp;nbsp; 0.4056025
&amp;nbsp;time3&amp;nbsp;&amp;nbsp; 0.2496016&lt;/PRE&gt;

&lt;P&gt;An additional 62.5%.&lt;/P&gt;

&lt;P&gt;My system did not have AVX2 (nor AVX512). I did not test on my KNC.&lt;/P&gt;

&lt;P&gt;As noted in the comments, the quadrature indexes are different. Those indices were arbitrary to begin with, redefinition shouldn't be much of an issue.&lt;/P&gt;

&lt;P&gt;You will need to run some verification on the results. Note, when either or both of the x1 and x2 cells are zero, the product will be 0.0 and the accumulation into x4 will add 0.0. This calculation is faster than performing&amp;nbsp;the series of&amp;nbsp;if tests with conditional set.&lt;/P&gt;

&lt;P&gt;One of the hidden problems you have with "where" if the consumption of excessive stack for the temporary arrays, also it is not directly usable with OpenMP, You can use it in OpenMP if you manually slice up the arrays. The do loop formats are easily adaptable to OpenMP.&lt;/P&gt;

&lt;P&gt;Jim Dempsey&lt;/P&gt;</description>
    <pubDate>Tue, 10 May 2016 13:39:49 GMT</pubDate>
    <dc:creator>jimdempseyatthecove</dc:creator>
    <dc:date>2016-05-10T13:39:49Z</dc:date>
    <item>
      <title>Where vs do &amp; if</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121893#M131906</link>
      <description>&lt;P&gt;Hi everyone,&lt;/P&gt;

&lt;P&gt;This is my first post. Hurray!!&lt;/P&gt;

&lt;P&gt;Today I was doing some testing on some conditional average of a 2-dimensional field based on the quadrant location. Looking for a way to speedup (optimize) I found the &lt;STRONG&gt;WHERE &lt;/STRONG&gt;instruction which I though will be faster than having &lt;STRONG&gt;IF&lt;/STRONG&gt; inside a nested do-loop (using vectorization or something else). I found out that using the &lt;STRONG&gt;WHERE &lt;/STRONG&gt;instruction is a little slower than actually using an &lt;STRONG&gt;IF.&amp;nbsp; &lt;/STRONG&gt;I was wondering if I am doing something wrong, or if it will be faster if and only if I use openMP. Below is the code I used for this testing.&lt;/P&gt;

&lt;P&gt;Thanks in advance.&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;program main
      use ifport
      integer, parameter :: n1=10000, n2=5000
      real, dimension(n1,n2) :: x1,x2
      real, dimension(n1,n2,4) :: x3, x4
      real :: stime, ftime
      integer :: i,j,k


      do j = 1, n2
        do i = 1, n1
          x1(i,j) = (2.*rand()-1.)
          x2(i,j) = (2.*rand()-1.)
        enddo
      enddo
      x3 =0.
      x4 =0.

      call cpu_time(stime)
      where((x1.gt.0.).and.(x2.gt.0))
       x3(:,:,1) = x3(:,:,1) + x1*x2
      elsewhere((x1.lt.0.).and.(x2.gt.0))
       x3(:,:,2) = x3(:,:,2) + x1*x2
      elsewhere((x1.lt.0.).and.(x2.lt.0))
       x3(:,:,3) = x3(:,:,3) + x1*x2
      elsewhere((x1.gt.0.).and.(x2.lt.0))
       x3(:,:,4) = x3(:,:,4) + x1*x2
      end where
      call cpu_time(ftime)
      write(*,*) 'time ', ftime-stime

      call cpu_time(stime)
      do j=1,n2
        do i=1,n1
          if ((x1(i,j).gt.0.).and.(x2(i,j).gt.0)) then
            x4(i,j,1) = x4(i,j,1) + x1(i,j)*x2(i,j)
          elseif ((x1(i,j).lt.0.).and.(x2(i,j).gt.0)) then
            x4(i,j,2) = x4(i,j,2) + x1(i,j)*x2(i,j)
          elseif ((x1(i,j).lt.0.).and.(x2(i,j).lt.0)) then
            x4(i,j,3) = x4(i,j,3) + x1(i,j)*x2(i,j)
          elseif ((x1(i,j).gt.0.).and.(x2(i,j).lt.0)) then
            x4(i,j,4) = x4(i,j,4) + x1(i,j)*x2(i,j)
          endif
        enddo
      enddo
      call cpu_time(ftime)
      write(*,*) 'time2 ', ftime-stime

end program&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;time&amp;nbsp;&amp;nbsp; 0.1079841&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;
	&amp;nbsp;time2&amp;nbsp;&amp;nbsp; 9.8984957E-02&lt;/P&gt;</description>
      <pubDate>Mon, 09 May 2016 22:07:24 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121893#M131906</guid>
      <dc:creator>Chris_S_7</dc:creator>
      <dc:date>2016-05-09T22:07:24Z</dc:date>
    </item>
    <item>
      <title>This test doesn't prevent the</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121894#M131907</link>
      <description>&lt;P&gt;This test doesn't prevent the compiler from taking shortcuts, as it can see that you never use any results.&lt;/P&gt;

&lt;P&gt;One might expect the where..elsewhere... to be slower in this case, as it implies generation of a bunch of logical arrays.&amp;nbsp; If the results are so close, the compiler must have done a fair job of eliminating these.&lt;/P&gt;

&lt;P&gt;Your conditions seem sufficiently complicated to kill hope of vectorization, but in that context, elsewhere tends to be inefficient.&lt;/P&gt;

&lt;P&gt;If you are trying to minimize cpu time, OpenMP is not the answer, as it generally trades use of more cores and total cpu time for the expectation of reduced elapsed time.&lt;/P&gt;</description>
      <pubDate>Tue, 10 May 2016 03:11:40 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121894#M131907</guid>
      <dc:creator>TimP</dc:creator>
      <dc:date>2016-05-10T03:11:40Z</dc:date>
    </item>
    <item>
      <title>Chris,</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121895#M131908</link>
      <description>&lt;P&gt;Chris,&lt;/P&gt;

&lt;P&gt;Experiment with something like this:&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;program main
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use ifport
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer, parameter :: n1=10000, n2=5000
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:,:) :: x1,x2, x1x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer, allocatable, dimension(:,:) :: idx
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:,:,:) :: x3, x4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real :: stime, ftime
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: i,j,k

&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(x1(n1,n2) ,x2(n1,n2), x1x2(n1,n2), idx(n1,n2))
&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(x3(n1,n2,4), x4(n1,n2,4))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j = 1, n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i = 1, n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x1(i,j) = (2.*rand()-1.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x2(i,j) = (2.*rand()-1.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3 =0.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4 =0.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where((x1.gt.0.).and.(x2.gt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,1) = x3(:,:,1) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.lt.0.).and.(x2.gt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,2) = x3(:,:,2) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.lt.0.).and.(x2.lt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,3) = x3(:,:,3) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.gt.0.).and.(x2.lt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,4) = x3(:,:,4) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end where
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time ', ftime-stime

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1,n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=1,n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((x1(i,j).gt.0.).and.(x2(i,j).gt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,1) = x4(i,j,1) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).lt.0.).and.(x2(i,j).gt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,2) = x4(i,j,2) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).lt.0.).and.(x2(i,j).lt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,3) = x4(i,j,3) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).gt.0.).and.(x2(i,j).lt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,4) = x4(i,j,4) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time2 ', ftime-stime
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x1x2 = x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx = (int(sign(1.0,x1)+sign(2.0,x2))+5)/2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! *** note the quanrant indexes differ
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int +5 /2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! ge ge&amp;nbsp; 1+2&amp;nbsp; 3&amp;nbsp;&amp;nbsp; 8&amp;nbsp; 4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! lt ge -1+2&amp;nbsp; 1&amp;nbsp;&amp;nbsp; 6&amp;nbsp; 3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! lt lt -1-2 -3&amp;nbsp;&amp;nbsp; 2&amp;nbsp; 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! ge lt&amp;nbsp; 1-2 -1&amp;nbsp;&amp;nbsp; 4&amp;nbsp; 2

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1,n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=1,n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,idx(i,j)) = x4(i,j,idx(i,j)) + x1x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time3 ', ftime-stime

end program
&lt;/PRE&gt;

&lt;PRE class="brush:plain;"&gt;&amp;nbsp;time&amp;nbsp;&amp;nbsp; 0.9204060
&amp;nbsp;time2&amp;nbsp;&amp;nbsp; 0.4056025
&amp;nbsp;time3&amp;nbsp;&amp;nbsp; 0.2496016&lt;/PRE&gt;

&lt;P&gt;An additional 62.5%.&lt;/P&gt;

&lt;P&gt;My system did not have AVX2 (nor AVX512). I did not test on my KNC.&lt;/P&gt;

&lt;P&gt;As noted in the comments, the quadrature indexes are different. Those indices were arbitrary to begin with, redefinition shouldn't be much of an issue.&lt;/P&gt;

&lt;P&gt;You will need to run some verification on the results. Note, when either or both of the x1 and x2 cells are zero, the product will be 0.0 and the accumulation into x4 will add 0.0. This calculation is faster than performing&amp;nbsp;the series of&amp;nbsp;if tests with conditional set.&lt;/P&gt;

&lt;P&gt;One of the hidden problems you have with "where" if the consumption of excessive stack for the temporary arrays, also it is not directly usable with OpenMP, You can use it in OpenMP if you manually slice up the arrays. The do loop formats are easily adaptable to OpenMP.&lt;/P&gt;

&lt;P&gt;Jim Dempsey&lt;/P&gt;</description>
      <pubDate>Tue, 10 May 2016 13:39:49 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121895#M131908</guid>
      <dc:creator>jimdempseyatthecove</dc:creator>
      <dc:date>2016-05-10T13:39:49Z</dc:date>
    </item>
    <item>
      <title>First of all, Thanks.</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121896#M131909</link>
      <description>&lt;P&gt;First of all, Thanks.&lt;/P&gt;

&lt;P&gt;Mr Dempsey,&lt;/P&gt;

&lt;P&gt;I did some tests to the changes you suggested and I found good and bad performance under different conditions. I did different compilations with different optimization levels. I realize that the optimization (O#) wasn't actually doing much. In fact, O3 optimization was making it slower. Overall, I think the results match yours. Now,&amp;nbsp; applying processor-specific optimization (-xHost) the performance of do-if method seems to surpass that of the pre-indexing (although not by much).&amp;nbsp; I am very curious on what is the compiler doing here.&lt;/P&gt;

&lt;P&gt;I left some other info below.&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;Thanks for the help!&lt;/P&gt;

&lt;PRE class="brush:plain;"&gt;
ifort -O3 -xHost test2.f90 
 time   0.4919240    
 time2   0.2159681    
 time3   0.2829571    

ifort -O3 test2.f90
 time    1.215815    
 time2   0.5139220    
 time3   0.3489470 

ifort -O2 test2.f90
 time    1.143826    
 time2   0.5239201    
 time3   0.2969561 

ifort  test2.f90
 time    1.144826    
 time2   0.5249200    
 time3   0.2969551 

ifort -xHost test2.f90 
 time   0.6429019    
 time2   0.2169669    
 time3   0.2899551    &lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;PRE class="brush:plain;"&gt;ifort version 14.0.3

Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz&lt;/PRE&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 10 May 2016 15:30:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121896#M131909</guid>
      <dc:creator>Chris_S_7</dc:creator>
      <dc:date>2016-05-10T15:30:00Z</dc:date>
    </item>
    <item>
      <title>If the compiler performs some</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121897#M131910</link>
      <description>&lt;P&gt;If the compiler performs some AVX vectorization under xHost, you can read about it in the files produced by -qopt-report4.&lt;/P&gt;</description>
      <pubDate>Tue, 10 May 2016 17:09:39 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121897#M131910</guid>
      <dc:creator>TimP</dc:creator>
      <dc:date>2016-05-10T17:09:39Z</dc:date>
    </item>
    <item>
      <title>This will give better L1</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121898#M131911</link>
      <description>&lt;P&gt;This will give better &lt;S&gt;L1&lt;/S&gt; L2 cache access patterns&lt;/P&gt;

&lt;PRE class="brush:fortran;"&gt;program main
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; use ifport
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer, parameter :: n1=10000, n2=5000
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !dir$ attributes align: 64:: x1,x2, x1x2, idx, x3, x4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:,:) :: x1, x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:) :: x1x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer(1), allocatable, dimension(:) :: idx
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real, allocatable, dimension(:,:,:) :: x3, x4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real :: stime, ftime
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; integer :: i,j,k

&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(x1(n1,n2) ,x2(n1,n2), x1x2(n1), idx(n1))
&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate(x3(n1,n2,4), x4(n1,n2,4))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j = 1, n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i = 1, n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x1(i,j) = (2.*rand()-1.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x2(i,j) = (2.*rand()-1.)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3 =0.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4 =0.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where((x1.gt.0.).and.(x2.gt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,1) = x3(:,:,1) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.lt.0.).and.(x2.gt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,2) = x3(:,:,2) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.lt.0.).and.(x2.lt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,3) = x3(:,:,3) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elsewhere((x1.gt.0.).and.(x2.lt.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x3(:,:,4) = x3(:,:,4) + x1*x2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end where
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time ', ftime-stime

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1,n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=1,n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((x1(i,j).gt.0.).and.(x2(i,j).gt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,1) = x4(i,j,1) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).lt.0.).and.(x2(i,j).gt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,2) = x4(i,j,2) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).lt.0.).and.(x2(i,j).lt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,3) = x4(i,j,3) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif ((x1(i,j).gt.0.).and.(x2(i,j).lt.0)) then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,4) = x4(i,j,4) + x1(i,j)*x2(i,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time2 ', ftime-stime
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(stime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! *** note the quanrant indexes differ
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int +5 /2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! ge ge&amp;nbsp; 1+2&amp;nbsp; 3&amp;nbsp;&amp;nbsp; 8&amp;nbsp; 4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! lt ge -1+2&amp;nbsp; 1&amp;nbsp;&amp;nbsp; 6&amp;nbsp; 3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! lt lt -1-2 -3&amp;nbsp;&amp;nbsp; 2&amp;nbsp; 1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ! ge lt&amp;nbsp; 1-2 -1&amp;nbsp;&amp;nbsp; 4&amp;nbsp; 2

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do j=1,n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x1x2 = x1(:,j)*x2(:,j)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx = (int(sign(1.0,x1(:,j))+sign(2.0,x2(:,j)))+5)/2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=1,n1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x4(i,j,idx(i)) = x4(i,j,idx(i)) + x1x2(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enddo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call cpu_time(ftime)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; write(*,*) 'time3 ', ftime-stime

end program
&lt;/PRE&gt;

&lt;P&gt;Results:&lt;/P&gt;

&lt;PRE class="brush:plain;"&gt;&amp;nbsp;time&amp;nbsp;&amp;nbsp; 0.9204059
&amp;nbsp;time2&amp;nbsp;&amp;nbsp; 0.4212027
&amp;nbsp;time3&amp;nbsp;&amp;nbsp; 0.1560011&lt;/PRE&gt;

&lt;P&gt;Jim Dempsey&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 10 May 2016 18:30:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/Where-vs-do-if/m-p/1121898#M131911</guid>
      <dc:creator>jimdempseyatthecove</dc:creator>
      <dc:date>2016-05-10T18:30:00Z</dc:date>
    </item>
  </channel>
</rss>

