<!-- HTML header for doxygen 1.8.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- For Mobile Devices -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<title>QuEST: QuEST_gpu.cu Source File</title>
<!--<link href="tabs.css" rel="stylesheet" type="text/css"/>-->
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="style.css" rel="stylesheet" type="text/css"/>
<link href='https://fonts.googleapis.com/css?family=Roboto+Slab' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="jquery.smartmenus.bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="jquery.smartmenus.js"></script>
<!-- SmartMenus jQuery Bootstrap Addon -->
<script type="text/javascript" src="jquery.smartmenus.bootstrap.js"></script>
<!-- SmartMenus jQuery plugin -->
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand"><img alt="Logo" src="logo.png"/></a>
<a class="navbar-brand"><b>QuEST</b> v3.4.0<br>The Quantum Exact Simulation Toolkit</a>
</div>
</div>
</nav>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div class="content" id="content">
<div class="container">
<div class="row">
<div class="col-sm-12 panel " style="padding-bottom: 15px;">
<div style="margin-bottom: 15px;">
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_e145b6391efe0b6e575fd5bb5f76dbf8.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_aaf4e0c86438000dc030ca371e863336.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_288db1ec25fc0ec29a6dc915511dd336.html">src</a></li><li class="navelem"><a class="el" href="dir_ab07507df26ab10c8d894f4336a7987b.html">GPU</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">QuEST_gpu.cu</div> </div>
</div><!--header-->
<div class="contents">
<a href="QuEST__gpu_8cu.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">// Distributed under MIT licence. See https://github.com/QuEST-Kit/QuEST/blob/master/LICENCE.txt for details</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>  </div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor"># include "<a class="code" href="QuEST_8h.html">QuEST.h</a>"</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor"># include "<a class="code" href="QuEST__precision_8h.html">QuEST_precision.h</a>"</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor"># include "<a class="code" href="QuEST__internal_8h.html">QuEST_internal.h</a>"</span> <span class="comment">// purely to resolve getQuESTDefaultSeedKey</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor"># include "<a class="code" href="mt19937ar_8h.html">mt19937ar.h</a>"</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  </div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor"># include <stdlib.h></span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor"># include <stdio.h></span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor"># include <math.h></span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  </div>
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53"> 19</a></span> <span class="preprocessor"># define REDUCE_SHARED_SIZE 512</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83"> 20</a></span> <span class="preprocessor"># define DEBUG 0</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  </div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  </div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> * struct types for concisely passing unitaries to kernels</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  </div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="comment">// hide these from doxygen</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"></span> </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keyword">typedef</span> <span class="keyword">struct </span>ArgMatrix2 {</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <a class="code" href="structComplex.html">Complex</a> r0c0, r0c1;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <a class="code" href="structComplex.html">Complex</a> r1c0, r1c1;</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  } ArgMatrix2;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  </div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="keyword">typedef</span> <span class="keyword">struct </span>ArgMatrix4</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  {</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <a class="code" href="structComplex.html">Complex</a> r0c0, r0c1, r0c2, r0c3;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <a class="code" href="structComplex.html">Complex</a> r1c0, r1c1, r1c2, r1c3;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="structComplex.html">Complex</a> r2c0, r2c1, r2c2, r2c3;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <a class="code" href="structComplex.html">Complex</a> r3c0, r3c1, r3c2, r3c3;</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  } ArgMatrix4;</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  </div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> ArgMatrix2 argifyMatrix2(<a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> m) { </div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  ArgMatrix2 a;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  a.r0c0.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]; a.r0c0.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0];</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  a.r0c1.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]; a.r0c1.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1];</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  a.r1c0.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]; a.r1c0.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0];</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  a.r1c1.real=m.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]; a.r1c1.imag=m.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1];</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">return</span> a;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  </div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> ArgMatrix4 argifyMatrix4(<a class="code" href="structComplexMatrix4.html">ComplexMatrix4</a> m) { </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  ArgMatrix4 a;</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  a.r0c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][0]; a.r0c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][0];</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  a.r0c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][1]; a.r0c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][1];</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  a.r0c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][2]; a.r0c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][2];</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  a.r0c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][3]; a.r0c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][3];</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  a.r1c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][0]; a.r1c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][0];</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  a.r1c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][1]; a.r1c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][1];</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  a.r1c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][2]; a.r1c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][2];</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  a.r1c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][3]; a.r1c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][3];</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  a.r2c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][0]; a.r2c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][0];</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  a.r2c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][1]; a.r2c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][1];</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  a.r2c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][2]; a.r2c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][2];</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  a.r2c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][3]; a.r2c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][3];</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  a.r3c0.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][0]; a.r3c0.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][0];</div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  a.r3c1.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][1]; a.r3c1.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][1];</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  a.r3c2.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][2]; a.r3c2.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][2];</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  a.r3c3.real=m.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][3]; a.r3c3.imag=m.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][3];</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keywordflow">return</span> a;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  }</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  </div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  </div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  </div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="comment"> * in-kernel bit twiddling functions</span></div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  </div>
<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0"> 82</a></span> __forceinline__ __device__ <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (<span class="keyword">const</span> <span class="keywordtype">int</span> locationOfBitFromRight, <span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> theEncodedNumber) {</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordflow">return</span> (theEncodedNumber & ( 1LL << locationOfBitFromRight )) >> locationOfBitFromRight;</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> }</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  </div>
<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c"> 86</a></span> __forceinline__ __device__ <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask) {</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordtype">int</span> parity = 0;</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordflow">while</span> (mask) {</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  parity = !parity;</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  mask = mask & (mask-1);</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  }</div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">return</span> parity;</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> }</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  </div>
<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7"> 95</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(<span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keyword">const</span> <span class="keywordtype">int</span> bitInd) {</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">return</span> (number ^ (1LL << bitInd));</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span> }</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  </div>
<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0"> 99</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(<span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keyword">const</span> <span class="keywordtype">int</span> index) {</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> left, right;</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  left = (number >> index) << index;</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  right = number - left;</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">return</span> (left << 1) ^ right;</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> }</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  </div>
<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138"> 106</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(<span class="keyword">const</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keyword">const</span> <span class="keywordtype">int</span> bit1, <span class="keyword">const</span> <span class="keywordtype">int</span> bit2) {</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordtype">int</span> small = (bit1 < bit2)? bit1 : bit2;</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="keywordtype">int</span> big = (bit1 < bit2)? bit2 : bit1;</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">return</span> <a class="code" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(<a class="code" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(number, small), big);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> }</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  </div>
<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9bac39238e100b0f845dc6e4deafc1c9"> 112</a></span> __forceinline__ __device__ <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a9bac39238e100b0f845dc6e4deafc1c9">insertZeroBits</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> number, <span class="keywordtype">int</span>* inds, <span class="keyword">const</span> <span class="keywordtype">int</span> numInds) {</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="comment">/* inserted bit inds must strictly increase, so that their final indices are correct.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment"> * in-lieu of sorting (avoided since no C++ variable-size arrays, and since we're already </span></div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment"> * memory bottle-necked so overhead eats this slowdown), we find the next-smallest index each </span></div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment"> * at each insert. recall every element of inds (a positive or zero number) is unique.</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"> * This function won't appear in the CPU code, which can use C99 variable-size arrays and </span></div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span> <span class="comment"> * ought to make a sorted array before threading</span></div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordtype">int</span> curMin = inds[0];</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordtype">int</span> prevMin = -1;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> n=0; n < numInds; n++) {</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  </div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// find next min</span></div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numInds; t++)</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">if</span> (inds[t]>prevMin && inds[t]<curMin)</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  curMin = inds[t];</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  </div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  number = <a class="code" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(number, curMin);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="comment">// set curMin to an arbitrary non-visited elem</span></div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  prevMin = curMin;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numInds; t++)</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">if</span> (inds[t] > curMin) {</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  curMin = inds[t];</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">return</span> number;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span> }</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  </div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  </div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  </div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment">/*</span></div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment"> * state vector and density matrix operations </span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  </div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">extern</span> <span class="stringliteral">"C"</span> {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  </div>
<div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f"> 153</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f">statevec_setAmps</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> startInd, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reals, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* imags, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps) {</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  cudaMemcpy(</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real + startInd, </div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  reals,</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  numAmps * <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), </div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  cudaMemcpy(</div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag + startInd,</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  imags,</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  numAmps * <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), </div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span> }</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  </div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  </div>
<div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b"> 170</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">statevec_cloneQureg</a>(<a class="code" href="structQureg.html">Qureg</a> targetQureg, <a class="code" href="structQureg.html">Qureg</a> copyQureg) {</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="comment">// copy copyQureg's GPU statevec to targetQureg's GPU statevec</span></div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  cudaMemcpy(</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  targetQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  cudaMemcpyDeviceToDevice);</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  cudaMemcpy(</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  targetQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), </div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  cudaMemcpyDeviceToDevice);</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> }</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  </div>
<div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e"> 186</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e">densmatr_initPureStateKernel</a>(</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numPureAmps,</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecImag, </div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecImag) </div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> {</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// this is a particular index of the pure copyQureg</span></div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">if</span> (index>=numPureAmps) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  </div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realRow = copyVecReal[index];</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagRow = copyVecImag[index];</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">for</span> (<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col=0; col < numPureAmps; col++) {</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realCol = copyVecReal[col];</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagCol = - copyVecImag[col]; <span class="comment">// minus for conjugation</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  targetVecReal[col*numPureAmps + index] = realRow*realCol - imagRow*imagCol;</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  targetVecImag[col*numPureAmps + index] = realRow*imagCol + imagRow*realCol;</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  </div>
<div class="line"><a name="l00205"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec"> 205</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec">densmatr_initPureState</a>(<a class="code" href="structQureg.html">Qureg</a> targetQureg, <a class="code" href="structQureg.html">Qureg</a> copyQureg)</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span> {</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(copyQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  densmatr_initPureStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  copyQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>,</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, targetQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag,</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, copyQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> }</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  </div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc"> 216</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc">densmatr_initPlusStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> probFactor, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  </div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  </div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  stateVecReal[index] = probFactor;</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span> }</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  </div>
<div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839"> 226</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839">densmatr_initPlusState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> {</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> probFactor = 1.0/((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>));</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  densmatr_initPlusStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  probFactor,</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> }</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  </div>
<div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e"> 239</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e">densmatr_initClassicalStateKernel</a>(</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityNumElems, </div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityImag, </div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityInd)</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> {</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="comment">// initialise the state to all zeros</span></div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (index >= densityNumElems) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  </div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  densityReal[index] = 0.0;</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  densityImag[index] = 0.0;</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  </div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">if</span> (index==densityInd){</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="comment">// classical state has probability 1</span></div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  densityReal[densityInd] = 1.0;</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  densityImag[densityInd] = 0.0;</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span> }</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  </div>
<div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d"> 258</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d">densmatr_initClassicalState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd)</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> {</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  </div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// index of the desired state in the flat density matrix</span></div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityInd = (densityDim + 1)*stateInd;</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  </div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="comment">// identical to pure version</span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  densmatr_initClassicalStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, densityInd);</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span> }</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  </div>
<div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5"> 275</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5">statevec_createQureg</a>(<a class="code" href="structQureg.html">Qureg</a> *qureg, <span class="keywordtype">int</span> numQubits, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env)</div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span> { </div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="comment">// allocate CPU memory</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = 1L << numQubits;</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsPerRank = numAmps/env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real));</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag));</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span> (env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>>1){</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real));</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(numAmpsPerRank * <span class="keyword">sizeof</span>(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag));</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  }</div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  </div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="comment">// check cpu memory allocation was successful</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">if</span> ( (!(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real) || !(qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag))</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  && numAmpsPerRank ) {</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  printf(<span class="stringliteral">"Could not allocate memory!\n"</span>);</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  exit (EXIT_FAILURE);</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  }</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordflow">if</span> ( env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>>1 && (!(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real) || !(qureg-><a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag))</div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  && numAmpsPerRank ) {</div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  printf(<span class="stringliteral">"Could not allocate memory!\n"</span>);</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  exit (EXIT_FAILURE);</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  }</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  </div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  qureg-><a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a> = numQubits;</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> = numAmpsPerRank;</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  qureg-><a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a> = numAmps;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  qureg-><a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> = env.<a class="code" href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">rank</a>;</div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  qureg-><a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a> = env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  qureg-><a class="code" href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">isDensityMatrix</a> = 0;</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  </div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="comment">// allocate GPU memory</span></div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real), qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)));</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag), qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)));</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), ceil(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)<a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>)*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  cudaMalloc(&(qureg-><a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>), ceil(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(<a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>*<a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>))*</div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  </div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="comment">// check gpu memory allocation was successful</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">if</span> (!(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real) || !(qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)){</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  printf(<span class="stringliteral">"Could not allocate memory on GPU!\n"</span>);</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  exit (EXIT_FAILURE);</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  }</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  </div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span> }</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  </div>
<div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217"> 321</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217">statevec_destroyQureg</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env)</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span> {</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="comment">// Free CPU memory</span></div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  free(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  free(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag);</div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">if</span> (env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>>1){</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  free(qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real);</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  free(qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag);</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  </div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="comment">// Free GPU memory</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  cudaFree(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real);</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  cudaFree(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  cudaFree(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  cudaFree(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>);</div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span> }</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  </div>
<div class="line"><a name="l00338"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0b84e6766bd682708e6211276ff0a5bb"> 338</a></span> <a class="code" href="structDiagonalOp.html">DiagonalOp</a> <a class="code" href="QuEST__gpu_8cu.html#a0b84e6766bd682708e6211276ff0a5bb">agnostic_createDiagonalOp</a>(<span class="keywordtype">int</span> numQubits, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env) {</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  </div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a> = numQubits;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> = (1LL << numQubits) / env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  op.<a class="code" href="structDiagonalOp.html#aa91713a22c95a383bba55e56c4a4e37a">chunkId</a> = env.<a class="code" href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">rank</a>;</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  op.<a class="code" href="structDiagonalOp.html#ada3bffa8e414f883e415dd74e46cd879">numChunks</a> = env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>;</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  </div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="comment">// allocate CPU memory (initialised to zero)</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a> = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) calloc(op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a> = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) calloc(op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="comment">// @TODO no handling of rank>1 allocation (no distributed GPU)</span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  </div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="comment">// check cpu memory allocation was successful</span></div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="keywordflow">if</span> ( !op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a> || !op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a> ) {</div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  printf(<span class="stringliteral">"Could not allocate memory!\n"</span>);</div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  exit(EXIT_FAILURE);</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  }</div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  </div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="comment">// allocate GPU memory</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordtype">size_t</span> arrSize = op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> * <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  cudaMalloc(&(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real), arrSize);</div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  cudaMalloc(&(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag), arrSize);</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  </div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="comment">// check gpu memory allocation was successful</span></div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">if</span> (!op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real || !op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag) {</div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  printf(<span class="stringliteral">"Could not allocate memory on GPU!\n"</span>);</div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  exit(EXIT_FAILURE);</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  }</div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  </div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="comment">// initialise GPU memory to zero</span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  cudaMemset(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, 0, arrSize);</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  cudaMemset(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, 0, arrSize);</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  </div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordflow">return</span> op;</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span> }</div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  </div>
<div class="line"><a name="l00375"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#af798bb01f922804016c4c5bc8d0a580f"> 375</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#af798bb01f922804016c4c5bc8d0a580f">agnostic_destroyDiagonalOp</a>(<a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  free(op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>);</div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  free(op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>);</div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  cudaFree(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real);</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  cudaFree(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag);</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span> }</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  </div>
<div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1e8f917ab42d38d8c37ba6816b24f2f5"> 382</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1e8f917ab42d38d8c37ba6816b24f2f5">agnostic_syncDiagonalOp</a>(<a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordtype">size_t</span> mem_elems = op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> * <span class="keyword">sizeof</span> *op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>;</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  cudaMemcpy(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>, mem_elems, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  cudaMemcpy(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>, mem_elems, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span> }</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  </div>
<div class="line"><a name="l00389"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9bf24d5da6a5e78888c393a73fe45f0a"> 389</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9bf24d5da6a5e78888c393a73fe45f0a">agnostic_initDiagonalOpFromPauliHamilKernel</a>(</div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a>* pauliCodes, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* termCoeffs, <span class="keywordtype">int</span> numSumTerms</div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span> ) { </div>
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="comment">// each thread processes one diagonal element</span></div>
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> elemInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">if</span> (elemInd >= op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a>)</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  </div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> elem = 0;</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  </div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="comment">// elem is (+-) every coefficient, with sign determined by parity</span></div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t<numSumTerms; t++) {</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  </div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="comment">// determine the parity of the Z-targeted qubits in the element's corresponding state</span></div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordtype">int</span> isOddNumOnes = 0;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>; q++)</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keywordflow">if</span> (pauliCodes[q + t*op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>] == <a class="code" href="group__type.html#gga1c703cf89629e4e9c7023cd402d67028a085c85cff6ba79c52d8b1e61c42ddddf">PAULI_Z</a>)</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(q, elemInd))</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  isOddNumOnes = !isOddNumOnes;</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  </div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="comment">// avoid warp divergence</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordtype">int</span> sign = 1 - 2*isOddNumOnes; <span class="comment">// (-1 if isOddNumOnes, else +1)</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  elem += termCoeffs[t] * sign;</div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  }</div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  </div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real[elemInd] = elem;</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag[elemInd] = 0;</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span> }</div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  </div>
<div class="line"><a name="l00418"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a81a87bb0f0805c9dfcb691f6cb15a1b5"> 418</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a81a87bb0f0805c9dfcb691f6cb15a1b5">agnostic_initDiagonalOpFromPauliHamil</a>(<a class="code" href="structDiagonalOp.html">DiagonalOp</a> op, <a class="code" href="structPauliHamil.html">PauliHamil</a> hamil) {</div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="comment">// copy args intop GPU memory</span></div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keyword">enum</span> <a class="code" href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a>* d_pauliCodes;</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordtype">size_t</span> mem_pauliCodes = hamil.<a class="code" href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">numSumTerms</a> * op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a> * <span class="keyword">sizeof</span> *d_pauliCodes;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  cudaMalloc(&d_pauliCodes, mem_pauliCodes);</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  cudaMemcpy(d_pauliCodes, hamil.<a class="code" href="structPauliHamil.html#a4b8d38c403553c07ceddcd40c46ce6c8">pauliCodes</a>, mem_pauliCodes, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  </div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_termCoeffs;</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordtype">size_t</span> mem_termCoeffs = hamil.<a class="code" href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">numSumTerms</a> * <span class="keyword">sizeof</span> *d_termCoeffs;</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  cudaMalloc(&d_termCoeffs, mem_termCoeffs);</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  cudaMemcpy(d_termCoeffs, hamil.<a class="code" href="structPauliHamil.html#ac1c6c9f6299cf83bbba88123216c3cac">termCoeffs</a>, mem_termCoeffs, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  </div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keywordtype">int</span> numBlocks = ceil(op.<a class="code" href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">numElemsPerChunk</a> / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  agnostic_initDiagonalOpFromPauliHamilKernel<<<numBlocks, numThreadsPerBlock>>>(</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  op, d_pauliCodes, d_termCoeffs, hamil.<a class="code" href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">numSumTerms</a>);</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  </div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="comment">// copy populated operator into to RAM</span></div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="keywordtype">size_t</span> mem_elems = op.numElemsPerChunk * <span class="keyword">sizeof</span> *op.real;</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  cudaMemcpy(op.real, op.deviceOperator.real, mem_elems, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  cudaMemcpy(op.imag, op.deviceOperator.imag, mem_elems, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  </div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  cudaFree(d_pauliCodes);</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  cudaFree(d_termCoeffs);</div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span> }</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  </div>
<div class="line"><a name="l00446"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886"> 446</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a>(<span class="keywordtype">void</span>){</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordtype">int</span> deviceCount, device;</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="keywordtype">int</span> gpuDeviceCount = 0;</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keyword">struct </span>cudaDeviceProp properties;</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  cudaError_t cudaResultCode = cudaGetDeviceCount(&deviceCount);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">if</span> (cudaResultCode != cudaSuccess) deviceCount = 0;</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="comment">/* machines with no GPUs can still report one emulation device */</span></div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">for</span> (device = 0; device < deviceCount; ++device) {</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  cudaGetDeviceProperties(&properties, device);</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keywordflow">if</span> (properties.major != 9999) { <span class="comment">/* 9999 means emulation only */</span></div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  ++gpuDeviceCount;</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  }</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">if</span> (gpuDeviceCount) <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordflow">else</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span> }</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  </div>
<div class="line"><a name="l00463"></a><span class="lineno"><a class="line" href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4"> 463</a></span> <a class="code" href="structQuESTEnv.html">QuESTEnv</a> <a class="code" href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">createQuESTEnv</a>(<span class="keywordtype">void</span>) {</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  </div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">if</span> (!<a class="code" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a>()){</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  printf(<span class="stringliteral">"Trying to run GPU code with no GPU available\n"</span>);</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  exit(EXIT_FAILURE);</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  }</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  </div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env;</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  env.<a class="code" href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">rank</a>=0;</div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>=1;</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  </div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  env.<a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a> = NULL;</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  env.<a class="code" href="structQuESTEnv.html#a46e67e1a5ab930e04ff59f83f1d8630d">numSeeds</a> = 0;</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <a class="code" href="group__debug.html#gae53fad7ebafccf236ad62b41e3244214">seedQuESTDefault</a>(env);</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  </div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="keywordflow">return</span> env;</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span> }</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  </div>
<div class="line"><a name="l00481"></a><span class="lineno"><a class="line" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"> 481</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span> } </div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  </div>
<div class="line"><a name="l00485"></a><span class="lineno"><a class="line" href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092"> 485</a></span> <span class="keywordtype">int</span> <a class="code" href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">syncQuESTSuccess</a>(<span class="keywordtype">int</span> successCode){</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keywordflow">return</span> successCode;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span> }</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  </div>
<div class="line"><a name="l00489"></a><span class="lineno"><a class="line" href="group__type.html#gaeff624226629d7063a8a776958a4f991"> 489</a></span> <span class="keywordtype">void</span> <a class="code" href="group__type.html#gaeff624226629d7063a8a776958a4f991">destroyQuESTEnv</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  free(env.<a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a>);</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span> }</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  </div>
<div class="line"><a name="l00493"></a><span class="lineno"><a class="line" href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9"> 493</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">reportQuESTEnv</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  printf(<span class="stringliteral">"EXECUTION ENVIRONMENT:\n"</span>);</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  printf(<span class="stringliteral">"Running locally on one node with GPU\n"</span>);</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  printf(<span class="stringliteral">"Number of ranks is %d\n"</span>, env.<a class="code" href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">numRanks</a>);</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  printf(<span class="stringliteral">"OpenMP enabled\n"</span>);</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  printf(<span class="stringliteral">"Number of threads available is %d\n"</span>, omp_get_max_threads());</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span> <span class="preprocessor"># else</span></div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  printf(<span class="stringliteral">"OpenMP disabled\n"</span>);</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span> }</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  </div>
<div class="line"><a name="l00505"></a><span class="lineno"><a class="line" href="group__debug.html#gadc5c01d8ea32e28c188db52be26116b6"> 505</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#gadc5c01d8ea32e28c188db52be26116b6">getEnvironmentString</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> env, <span class="keywordtype">char</span> str[200]){</div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  </div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="comment">// OpenMP can be hybridised with GPU in future, so this check is safe and worthwhile</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordtype">int</span> ompStatus=0;</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordtype">int</span> numThreads=1;</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  ompStatus=1;</div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  numThreads=omp_get_max_threads(); </div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  </div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="comment">// there is no reporting of CUDA cores/threads/blocks currently (since non-trivial)</span></div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  sprintf(str, <span class="stringliteral">"CUDA=1 OpenMP=%d MPI=0 threads=%d ranks=1"</span>, ompStatus, numThreads);</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span> }</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  </div>
<div class="line"><a name="l00519"></a><span class="lineno"><a class="line" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7"> 519</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span> {</div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Copying data to GPU\n"</span>);</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real, </div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag, </div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Finished copying data to GPU\n"</span>);</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span> }</div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  </div>
<div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece"> 529</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span> {</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Copying data from GPU\n"</span>);</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  cudaMemcpy(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*<span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>) printf(<span class="stringliteral">"Finished copying data from GPU\n"</span>);</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span> }</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  </div>
<div class="line"><a name="l00543"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524"> 543</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">statevec_reportStateToScreen</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env, <span class="keywordtype">int</span> reportRank){</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="keywordtype">int</span> rank;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg); </div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a><=5){</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">for</span> (rank=0; rank<qureg.<a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>; rank++){</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>==rank){</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordflow">if</span> (reportRank) {</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  printf(<span class="stringliteral">"Reporting state from rank %d [\n"</span>, qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>);</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="comment">//printf("\trank, index, real, imag\n");</span></div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rank==0) {</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  printf(<span class="stringliteral">"Reporting state [\n"</span>);</div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  }</div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  </div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordflow">for</span>(index=0; index<qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>; index++){</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  printf(REAL_STRING_FORMAT <span class="stringliteral">", "</span> REAL_STRING_FORMAT <span class="stringliteral">"\n"</span>, qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[index], qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[index]);</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  }</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">if</span> (reportRank || rank==qureg.<a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>-1) printf(<span class="stringliteral">"]\n"</span>);</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  }</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <a class="code" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a>(env);</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  }</div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  }</div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span> }</div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  </div>
<div class="line"><a name="l00569"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9"> 569</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9">statevec_getRealAmp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index){</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index]), </div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span> }</div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  </div>
<div class="line"><a name="l00576"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f"> 576</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f">statevec_getImagAmp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index){</div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]), </div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span> }</div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  </div>
<div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550"> 583</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550">statevec_initBlankStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  </div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// initialise the statevector to be all-zeros</span></div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span> }</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  </div>
<div class="line"><a name="l00593"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae"> 593</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae">statevec_initBlankState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span> {</div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  statevec_initBlankStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span> }</div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  </div>
<div class="line"><a name="l00604"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064"> 604</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064">statevec_initZeroStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  </div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="comment">// initialise the state to |0000..0000></span></div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  </div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">if</span> (index==0){</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="comment">// zero state |0000..0000> has probability 1</span></div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  stateVecReal[0] = 1.0;</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  stateVecImag[0] = 0.0;</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  }</div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span> }</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  </div>
<div class="line"><a name="l00620"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966"> 620</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966">statevec_initZeroState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> {</div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  statevec_initZeroStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> }</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  </div>
<div class="line"><a name="l00631"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222"> 631</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222">statevec_initPlusStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  </div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  </div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> normFactor = 1.0/sqrt((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)stateVecSize);</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span> }</div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  </div>
<div class="line"><a name="l00642"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0"> 642</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0">statevec_initPlusState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span> {</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  statevec_initPlusStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span> }</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  </div>
<div class="line"><a name="l00653"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd"> 653</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd">statevec_initClassicalStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd){</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  </div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="comment">// initialise the state to |stateInd></span></div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  </div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> (index==stateInd){</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="comment">// classical state has probability 1</span></div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  stateVecReal[stateInd] = 1.0;</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  stateVecImag[stateInd] = 0.0;</div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> }</div>
<div class="line"><a name="l00668"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7"> 668</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7">statevec_initClassicalState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd)</div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span> {</div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  statevec_initClassicalStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, stateInd);</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> }</div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  </div>
<div class="line"><a name="l00679"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427"> 679</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427">statevec_initDebugStateKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag){</div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  </div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  </div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  stateVecReal[index] = (index*2.0)/10.0;</div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  stateVecImag[index] = (index*2.0+1.0)/10.0;</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span> }</div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  </div>
<div class="line"><a name="l00689"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972"> 689</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">statevec_initDebugState</a>(<a class="code" href="structQureg.html">Qureg</a> qureg)</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span> {</div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  statevec_initDebugStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>,</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span> }</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  </div>
<div class="line"><a name="l00700"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71"> 700</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71">statevec_initStateOfSingleQubitKernel</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, <span class="keywordtype">int</span> qubitId, <span class="keywordtype">int</span> outcome){</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keywordtype">int</span> bit;</div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  </div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  </div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> normFactor = 1.0/sqrt((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)stateVecSize/2);</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  bit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubitId, index);</div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">if</span> (bit==outcome) {</div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  }</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span> }</div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  </div>
<div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64"> 718</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">statevec_initStateOfSingleQubit</a>(<a class="code" href="structQureg.html">Qureg</a> *qureg, <span class="keywordtype">int</span> qubitId, <span class="keywordtype">int</span> outcome)</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span> {</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  statevec_initStateOfSingleQubitKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg-><a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, qubitId, outcome);</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span> }</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  </div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span> <span class="comment">// returns 1 if successful, else 0</span></div>
<div class="line"><a name="l00727"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20"> 727</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20">statevec_initStateFromSingleFile</a>(<a class="code" href="structQureg.html">Qureg</a> *qureg, <span class="keywordtype">char</span> filename[200], <a class="code" href="structQuESTEnv.html">QuESTEnv</a> env){</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize, stateVecSize;</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexInChunk, totalIndex;</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  </div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  chunkSize = qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  stateVecSize = chunkSize*qureg-><a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>;</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  </div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg-><a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  </div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  FILE *fp;</div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="keywordtype">char</span> line[200];</div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  </div>
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  fp = fopen(filename, <span class="stringliteral">"r"</span>);</div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordflow">if</span> (fp == NULL)</div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  </div>
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  indexInChunk = 0; totalIndex = 0;</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <span class="keywordflow">while</span> (fgets(line, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>)*200, fp) != NULL && totalIndex<stateVecSize){</div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keywordflow">if</span> (line[0]!=<span class="charliteral">'#'</span>){</div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordtype">int</span> chunkId = totalIndex/chunkSize;</div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keywordflow">if</span> (chunkId==qureg-><a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>){</div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span> <span class="preprocessor"> # if QuEST_PREC==1</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  sscanf(line, <span class="stringliteral">"%f, %f"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span> <span class="preprocessor"> # elif QuEST_PREC==2</span></div>
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span> <span class="preprocessor"> # elif QuEST_PREC==4</span></div>
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  indexInChunk += 1;</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  }</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  totalIndex += 1;</div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  }</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  }</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  fclose(fp);</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  <a class="code" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a>(*qureg);</div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  </div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="comment">// indicate success</span></div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span> }</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  </div>
<div class="line"><a name="l00771"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33"> 771</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33">statevec_compareStates</a>(<a class="code" href="structQureg.html">Qureg</a> mq1, <a class="code" href="structQureg.html">Qureg</a> mq2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> precision){</div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> diff;</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keywordtype">int</span> chunkSize = mq1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  </div>
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq1);</div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq2);</div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  </div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<chunkSize; i++){</div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  diff = mq1.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[i] - mq2.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[i];</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  diff = mq1.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[i] - mq2.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[i];</div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  }</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> }</div>
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  </div>
<div class="line"><a name="l00789"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4d5c3bc20e1fe6f36e1f92e6d030afc7"> 789</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4d5c3bc20e1fe6f36e1f92e6d030afc7">statevec_compactUnitaryKernel</a> (<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> rotQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta){</div>
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  </div>
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  </div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  sizeHalfBlock = 1LL << rotQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  </div>
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  </div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> alphaImag=alpha.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, alphaReal=alpha.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> betaImag=beta.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, betaReal=beta.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  </div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  </div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  </div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  </div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  </div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  </div>
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span> }</div>
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  </div>
<div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aec63559e8b9ab0e17efe18d64d2ceca6"> 844</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aec63559e8b9ab0e17efe18d64d2ceca6">statevec_compactUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta) </div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span> {</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  statevec_compactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span> }</div>
<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  </div>
<div class="line"><a name="l00852"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab1bc0bf471c4459dd845adbfac5ef857"> 852</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab1bc0bf471c4459dd845adbfac5ef857">statevec_controlledCompactUnitaryKernel</a> (<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta){</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  </div>
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  </div>
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  </div>
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  </div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> alphaImag=alpha.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, alphaReal=alpha.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> betaImag=beta.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, betaReal=beta.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  </div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  </div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  </div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  </div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  </div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  </div>
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  }</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span> }</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  </div>
<div class="line"><a name="l00911"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1275d604674224d87a173fb5bac78835"> 911</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1275d604674224d87a173fb5bac78835">statevec_controlledCompactUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> alpha, <a class="code" href="structComplex.html">Complex</a> beta) </div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span> {</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  statevec_controlledCompactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> }</div>
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  </div>
<div class="line"><a name="l00919"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a19e364fb77ebe56afd7cd7cc6de12449"> 919</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a19e364fb77ebe56afd7cd7cc6de12449">statevec_unitaryKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, ArgMatrix2 u){</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  </div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  </div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  </div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  </div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  </div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  </div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  </div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  </div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  </div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  </div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span> }</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  </div>
<div class="line"><a name="l00972"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac3735bd959600e57b2ee3a105666cddf"> 972</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac3735bd959600e57b2ee3a105666cddf">statevec_unitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span> {</div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  statevec_unitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span> }</div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  </div>
<div class="line"><a name="l00980"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20"> 980</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20">statevec_multiControlledMultiQubitUnitaryKernel</a>(</div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span>* targs, <span class="keywordtype">int</span> numTargs, </div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uRe, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uIm, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* ampInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reAmps, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* imAmps, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTargAmps)</div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span> {</div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  </div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="comment">// decide the amplitudes this thread will modify</span></div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x; </div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> numTargs; <span class="comment">// kernel called on every 1 in 2^numTargs amplitudes</span></div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  </div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="comment">// find this task's start index (where all targs are 0)</span></div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00 = <a class="code" href="QuEST__gpu_8cu.html#a9bac39238e100b0f845dc6e4deafc1c9">insertZeroBits</a>(thisTask, targs, numTargs);</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  </div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="comment">// this task only modifies amplitudes if control qubits are 1 for this state</span></div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  </div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  </div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> <span class="comment"> each thread needs:</span></div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span> <span class="comment"> long long int ampInds[numAmps];</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> <span class="comment"> qreal reAmps[numAmps];</span></div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> <span class="comment"> qreal imAmps[numAmps];</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> <span class="comment"> but instead has access to shared arrays, with below stride and offset</span></div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span> <span class="comment"> */</span></div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  </div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="comment">// determine the indices and record values of target amps</span></div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind;</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i < numTargAmps; i++) {</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  </div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <span class="comment">// get global index of current target qubit assignment</span></div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  ind = ind00;</div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numTargs; t++)</div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(t, i))</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  ind = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind, targs[t]);</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  </div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  ampInds[i*stride+offset] = ind;</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  reAmps [i*stride+offset] = reVec[ind];</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  imAmps [i*stride+offset] = imVec[ind];</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  }</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  </div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <span class="comment">// update the amplitudes</span></div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < numTargAmps; r++) {</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  ind = ampInds[r*stride+offset];</div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  reVec[ind] = 0;</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  imVec[ind] = 0;</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < numTargAmps; c++) {</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uReElem = uRe[c + r*numTargAmps];</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uImElem = uIm[c + r*numTargAmps];</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  reVec[ind] += reAmps[c*stride+offset]*uReElem - imAmps[c*stride+offset]*uImElem;</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  imVec[ind] += reAmps[c*stride+offset]*uImElem + imAmps[c*stride+offset]*uReElem;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  }</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  }</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> }</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  </div>
<div class="line"><a name="l01039"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0acfe30083d0bc2a84da196378a36122"> 1039</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a0acfe30083d0bc2a84da196378a36122">statevec_multiControlledMultiQubitUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span>* targs, <span class="keywordtype">int</span> numTargs, <a class="code" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> {</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>numTargs)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  </div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  <span class="comment">// allocate device space for global {targs} (length: numTargs) and populate</span></div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordtype">int</span> *d_targs;</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <span class="keywordtype">size_t</span> targMemSize = numTargs * <span class="keyword">sizeof</span> *d_targs;</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  cudaMalloc(&d_targs, targMemSize);</div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  cudaMemcpy(d_targs, targs, targMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  </div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// flatten out the u.real and u.imag lists</span></div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordtype">int</span> uNumRows = (1 << u.<a class="code" href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">numQubits</a>);</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uReFlat = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(uNumRows*uNumRows * <span class="keyword">sizeof</span> *uReFlat);</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* uImFlat = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) malloc(uNumRows*uNumRows * <span class="keyword">sizeof</span> *uImFlat);</div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> i = 0;</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < uNumRows; r++)</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < uNumRows; c++) {</div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  uReFlat[i] = u.<a class="code" href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">real</a>[r][c];</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  uImFlat[i] = u.<a class="code" href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">imag</a>[r][c];</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  i++;</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  }</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  </div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  <span class="comment">// allocate device space for global u.real and u.imag (flatten by concatenating rows) and populate</span></div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uRe;</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uIm;</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="keywordtype">size_t</span> uMemSize = uNumRows*uNumRows * <span class="keyword">sizeof</span> *d_uRe; <span class="comment">// size of each of d_uRe and d_uIm</span></div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  cudaMalloc(&d_uRe, uMemSize);</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  cudaMalloc(&d_uIm, uMemSize);</div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  cudaMemcpy(d_uRe, uReFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  cudaMemcpy(d_uIm, uImFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  </div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  <span class="comment">// allocate device Wspace for thread-local {ampInds}, {reAmps}, {imAmps} (length: 1<<numTargs)</span></div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_ampInds;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_reAmps;</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_imAmps;</div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  <span class="keywordtype">int</span> numTargAmps = uNumRows;</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  cudaMalloc(&d_ampInds, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_ampInds);</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  cudaMalloc(&d_reAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_reAmps);</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  cudaMalloc(&d_imAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_imAmps);</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  </div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  statevec_multiControlledMultiQubitUnitaryKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  qureg, ctrlMask, d_targs, numTargs, d_uRe, d_uIm, d_ampInds, d_reAmps, d_imAmps, numTargAmps);</div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  </div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  <span class="comment">// free kernel memory</span></div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  free(uReFlat);</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  free(uImFlat);</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  cudaFree(d_targs);</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  cudaFree(d_uRe);</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  cudaFree(d_uIm);</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  cudaFree(d_ampInds);</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  cudaFree(d_reAmps);</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  cudaFree(d_imAmps);</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> }</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  </div>
<div class="line"><a name="l01096"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aed40f77bf851930363897f3d28a5093b"> 1096</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aed40f77bf851930363897f3d28a5093b">statevec_multiControlledTwoQubitUnitaryKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span> q1, <span class="keywordtype">int</span> q2, ArgMatrix4 u){</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  </div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <span class="comment">// decide the 4 amplitudes this thread will modify</span></div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x; </div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 2; <span class="comment">// kernel called on every 1 in 4 amplitudes</span></div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  </div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  </div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="comment">// find indices of amplitudes to modify (treat q1 as the least significant bit)</span></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00, ind01, ind10, ind11;</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(thisTask, q1, q2);</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  </div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="comment">// modify only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  </div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, q1);</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, q2);</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  ind11 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind01, q2);</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  </div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re00, re01, re10, re11;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im00, im01, im10, im11;</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  re00 = reVec[ind00]; im00 = imVec[ind00];</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  re11 = reVec[ind11]; im11 = imVec[ind11];</div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  </div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="comment">// apply u * {amp00, amp01, amp10, amp11}</span></div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  reVec[ind00] = </div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  u.r0c0.real*re00 - u.r0c0.imag*im00 +</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  u.r0c1.real*re01 - u.r0c1.imag*im01 +</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  u.r0c2.real*re10 - u.r0c2.imag*im10 +</div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  u.r0c3.real*re11 - u.r0c3.imag*im11;</div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  imVec[ind00] =</div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  u.r0c0.imag*re00 + u.r0c0.real*im00 +</div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  u.r0c1.imag*re01 + u.r0c1.real*im01 +</div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  u.r0c2.imag*re10 + u.r0c2.real*im10 +</div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  u.r0c3.imag*re11 + u.r0c3.real*im11;</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  </div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  reVec[ind01] = </div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  u.r1c0.real*re00 - u.r1c0.imag*im00 +</div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  u.r1c1.real*re01 - u.r1c1.imag*im01 +</div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  u.r1c2.real*re10 - u.r1c2.imag*im10 +</div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  u.r1c3.real*re11 - u.r1c3.imag*im11;</div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  imVec[ind01] =</div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  u.r1c0.imag*re00 + u.r1c0.real*im00 +</div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  u.r1c1.imag*re01 + u.r1c1.real*im01 +</div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  u.r1c2.imag*re10 + u.r1c2.real*im10 +</div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  u.r1c3.imag*re11 + u.r1c3.real*im11;</div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  </div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  reVec[ind10] = </div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  u.r2c0.real*re00 - u.r2c0.imag*im00 +</div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  u.r2c1.real*re01 - u.r2c1.imag*im01 +</div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  u.r2c2.real*re10 - u.r2c2.imag*im10 +</div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  u.r2c3.real*re11 - u.r2c3.imag*im11;</div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  imVec[ind10] =</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  u.r2c0.imag*re00 + u.r2c0.real*im00 +</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  u.r2c1.imag*re01 + u.r2c1.real*im01 +</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  u.r2c2.imag*re10 + u.r2c2.real*im10 +</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  u.r2c3.imag*re11 + u.r2c3.real*im11; </div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  </div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  reVec[ind11] = </div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  u.r3c0.real*re00 - u.r3c0.imag*im00 +</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  u.r3c1.real*re01 - u.r3c1.imag*im01 +</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  u.r3c2.real*re10 - u.r3c2.imag*im10 +</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  u.r3c3.real*re11 - u.r3c3.imag*im11;</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  imVec[ind11] =</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  u.r3c0.imag*re00 + u.r3c0.real*im00 +</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  u.r3c1.imag*re01 + u.r3c1.real*im01 +</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  u.r3c2.imag*re10 + u.r3c2.real*im10 +</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  u.r3c3.imag*re11 + u.r3c3.real*im11; </div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span> }</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  </div>
<div class="line"><a name="l01172"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#affbd18d7c2ed8d5bd5edb67116501145"> 1172</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#affbd18d7c2ed8d5bd5edb67116501145">statevec_multiControlledTwoQubitUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span> q1, <span class="keywordtype">int</span> q2, <a class="code" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> {</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>2)/threadsPerCUDABlock); <span class="comment">// one kernel eval for every 4 amplitudes</span></div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  statevec_multiControlledTwoQubitUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, ctrlMask, q1, q2, argifyMatrix4(u));</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> }</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  </div>
<div class="line"><a name="l01179"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae4ee10f6db39b2634c82159322181826"> 1179</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ae4ee10f6db39b2634c82159322181826">statevec_controlledUnitaryKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit, ArgMatrix2 u){</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  </div>
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  </div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  </div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  </div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  </div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  </div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  </div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  </div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  </div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  </div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  </div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  }</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span> }</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  </div>
<div class="line"><a name="l01237"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#add9ca9956cdd81ed5d0b0f66168c04a3"> 1237</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#add9ca9956cdd81ed5d0b0f66168c04a3">statevec_controlledUnitary</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span> {</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  statevec_controlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span> }</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  </div>
<div class="line"><a name="l01245"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6d0bd05cfccc67102864429f1046ecc3"> 1245</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a6d0bd05cfccc67102864429f1046ecc3">statevec_multiControlledUnitaryKernel</a>(</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, </div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlFlipMask, </div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  <span class="keywordtype">int</span> targetQubit, ArgMatrix2 u</div>
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> ){</div>
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  </div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  </div>
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  </div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  </div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  </div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  </div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  </div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  </div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  <span class="keywordflow">if</span> (ctrlQubitsMask == (ctrlQubitsMask & (indexUp ^ ctrlFlipMask))) {</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  </div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  </div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  </div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  }</div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span> }</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  </div>
<div class="line"><a name="l01305"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a600bda10463e2078ce746ec28f2d39c9"> 1305</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a600bda10463e2078ce746ec28f2d39c9">statevec_multiControlledUnitary</a>(</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, </div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlQubitsMask, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlFlipMask, </div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplexMatrix2.html">ComplexMatrix2</a> u</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span> ){</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  statevec_multiControlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  qureg, ctrlQubitsMask, ctrlFlipMask, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> }</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  </div>
<div class="line"><a name="l01316"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a61f547009235f367c6f983f8768dae19"> 1316</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a61f547009235f367c6f983f8768dae19">statevec_pauliXKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit){</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  </div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  </div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  </div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  </div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  </div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  </div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  </div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  </div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  </div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> }</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  </div>
<div class="line"><a name="l01360"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1c82b5e914a8a39c5c7b782dbc16fa76"> 1360</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1c82b5e914a8a39c5c7b782dbc16fa76">statevec_pauliX</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span> {</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  statevec_pauliXKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span> }</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  </div>
<div class="line"><a name="l01368"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2b9beefe0873d2c2e8fec68f86e057fc"> 1368</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2b9beefe0873d2c2e8fec68f86e057fc">statevec_pauliYKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <span class="keywordtype">int</span> conjFac){</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  </div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 1;</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  </div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp;</div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  </div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  </div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> }</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  </div>
<div class="line"><a name="l01393"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#af1cca787f3b0e0c91ffb2495f9ad8d5a"> 1393</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#af1cca787f3b0e0c91ffb2495f9ad8d5a">statevec_pauliY</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> {</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, 1);</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> }</div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  </div>
<div class="line"><a name="l01401"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a81fbd2eccd0d0e5a3cece4df2f96cb92"> 1401</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a81fbd2eccd0d0e5a3cece4df2f96cb92">statevec_pauliYConj</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> {</div>
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, -1);</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span> }</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  </div>
<div class="line"><a name="l01409"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac65fd6109f08a191a7811ddf72886d55"> 1409</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac65fd6109f08a191a7811ddf72886d55">statevec_controlledPauliYKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit, <span class="keywordtype">int</span> conjFac)</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span> {</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  </div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp; </div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, indexUp, indexLo; </div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  </div>
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  </div>
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  </div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  </div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  </div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  }</div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span> }</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  </div>
<div class="line"><a name="l01445"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4e19ef93d01d7acea32ca646d623aedd"> 1445</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4e19ef93d01d7acea32ca646d623aedd">statevec_controlledPauliY</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span> {</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="keywordtype">int</span> conjFactor = 1;</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span> }</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  </div>
<div class="line"><a name="l01454"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4a2fa262d3f0dba372797b9bd35d9fa5"> 1454</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4a2fa262d3f0dba372797b9bd35d9fa5">statevec_controlledPauliYConj</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span> {</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordtype">int</span> conjFactor = -1;</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> }</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  </div>
<div class="line"><a name="l01463"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad2c5cb1c21c9d6cab081b820d1ba4995"> 1463</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad2c5cb1c21c9d6cab081b820d1ba4995">statevec_phaseShiftByTermKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  </div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, indexUp,indexLo;</div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>  </div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo; </div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 1;</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  </div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  </div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  </div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  </div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  </div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  stateVecReal[indexLo] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  stateVecImag[indexLo] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> }</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  </div>
<div class="line"><a name="l01491"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a535cc3c9962d511078691e4d64b4e272"> 1491</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a535cc3c9962d511078691e4d64b4e272">statevec_phaseShiftByTerm</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="structComplex.html">Complex</a> term)</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span> { </div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = term.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = term.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  </div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  statevec_phaseShiftByTermKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, cosAngle, sinAngle);</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span> }</div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  </div>
<div class="line"><a name="l01502"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a2f95208e214543c15c3e16cc2e091d5c"> 1502</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a2f95208e214543c15c3e16cc2e091d5c">statevec_controlledPhaseShiftKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> idQubit1, <span class="keywordtype">int</span> idQubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span> {</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  </div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  </div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  </div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  </div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  }</div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span> }</div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  </div>
<div class="line"><a name="l01527"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a63df1ec14ff7cc81c3f392ac10fcc744"> 1527</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a63df1ec14ff7cc81c3f392ac10fcc744">statevec_controlledPhaseShift</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> idQubit1, <span class="keywordtype">int</span> idQubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span> {</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  </div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  statevec_controlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2, cosAngle, sinAngle);</div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> }</div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  </div>
<div class="line"><a name="l01538"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647"> 1538</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647">statevec_multiControlledPhaseShiftKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  </div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  </div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  </div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  }</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> }</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  </div>
<div class="line"><a name="l01558"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c"> 1558</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> *controlQubits, <span class="keywordtype">int</span> numControlQubits, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span> { </div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  </div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask = <a class="code" href="QuEST__common_8c.html#acc45bb8300922ea5933e294921e25ea2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  </div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  statevec_multiControlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span> }</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  </div>
<div class="line"><a name="l01571"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed"> 1571</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed">statevec_multiRotateZKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  </div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  </div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  </div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <span class="keywordtype">int</span> fac = <a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(mask & index)? -1 : 1;</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateReal = stateVecReal[index];</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateImag = stateVecImag[index];</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  </div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  stateVecReal[index] = cosAngle*stateReal + fac * sinAngle*stateImag;</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  stateVecImag[index] = - fac * sinAngle*stateReal + cosAngle*stateImag; </div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> }</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  </div>
<div class="line"><a name="l01588"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44"> 1588</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span> { </div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle/2.0);</div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle/2.0);</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  </div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  statevec_multiRotateZKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span> }</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  </div>
<div class="line"><a name="l01599"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aac71aef8fca67e5a0547ea2d3426d40d"> 1599</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aac71aef8fca67e5a0547ea2d3426d40d">statevec_multiControlledMultiRotateZKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> targMask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle) {</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  </div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  </div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <span class="comment">// amplitudes corresponding to control qubits not all-in-one are unmodified</span></div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & index) != ctrlMask))</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  </div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  </div>
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="comment">// avoid warp divergence, setting fac = +- 1</span></div>
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  <span class="keywordtype">int</span> fac = 1-2*<a class="code" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a>(targMask & index);</div>
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateReal = stateVecReal[index];</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateImag = stateVecImag[index];</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  </div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  stateVecReal[index] = cosAngle*stateReal + fac * sinAngle*stateImag;</div>
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  stateVecImag[index] = - fac * sinAngle*stateReal + cosAngle*stateImag; </div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> }</div>
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  </div>
<div class="line"><a name="l01621"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a3ed30f823a59890be17441d97ce90c5c"> 1621</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a3ed30f823a59890be17441d97ce90c5c">statevec_multiControlledMultiRotateZ</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> targMask, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span> { </div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle/2.0);</div>
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle/2.0);</div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  </div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  statevec_multiControlledMultiRotateZKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, ctrlMask, targMask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span> }</div>
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  </div>
<div class="line"><a name="l01632"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c"> 1632</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c">densmatr_calcTotalProb</a>(<a class="code" href="structQureg.html">Qureg</a> qureg) {</div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  </div>
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <span class="comment">// computes the trace using Kahan summation</span></div>
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  c = 0;</div>
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  </div>
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numCols = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> diagIndex;</div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  </div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  </div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> col=0; col< numCols; col++) {</div>
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  diagIndex = col*(numCols + 1);</div>
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[diagIndex] - c;</div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>  t = pTotal + y;</div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  c = ( t - pTotal ) - y; <span class="comment">// brackets are important</span></div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  pTotal = t;</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  }</div>
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  </div>
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span> }</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  </div>
<div class="line"><a name="l01655"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"> 1655</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">statevec_calcTotalProb</a>(<a class="code" href="structQureg.html">Qureg</a> qureg){</div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="comment">/* IJB - implemented using Kahan summation for greater accuracy at a slight floating</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span> <span class="comment"> point operation overhead. For more details see https://en.wikipedia.org/wiki/Kahan_summation_algorithm */</span></div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  <span class="comment">/* Don't change the bracketing in this routine! */</span></div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsPerRank = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  </div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  </div>
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  c = 0.0;</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="keywordflow">for</span> (index=0; index<numAmpsPerRank; index++){</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index]; by Kahan */</span></div>
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  <span class="comment">// pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index];</span></div>
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[index]*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[index] - c;</div>
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  t = pTotal + y;</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  pTotal = t;</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  </div>
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index]; by Kahan */</span></div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="comment">//pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index];</span></div>
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[index]*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[index] - c;</div>
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  t = pTotal + y;</div>
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  pTotal = t;</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  </div>
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  </div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  }</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> }</div>
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  </div>
<div class="line"><a name="l01687"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a1653a2901d0a843e00127e7150c31384"> 1687</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a1653a2901d0a843e00127e7150c31384">statevec_controlledPhaseFlipKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> idQubit1, <span class="keywordtype">int</span> idQubit2)</div>
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span> {</div>
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  </div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  </div>
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  </div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  }</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> }</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  </div>
<div class="line"><a name="l01708"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aaf78491e35d165edfd57387f9fffecbd"> 1708</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aaf78491e35d165edfd57387f9fffecbd">statevec_controlledPhaseFlip</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> idQubit1, <span class="keywordtype">int</span> idQubit2)</div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> {</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  statevec_controlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2);</div>
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span> }</div>
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  </div>
<div class="line"><a name="l01716"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98"> 1716</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98">statevec_multiControlledPhaseFlipKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask)</div>
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span> {</div>
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  </div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  </div>
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  </div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  }</div>
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> }</div>
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>  </div>
<div class="line"><a name="l01734"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d"> 1734</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> *controlQubits, <span class="keywordtype">int</span> numControlQubits)</div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span> {</div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mask = <a class="code" href="QuEST__common_8c.html#acc45bb8300922ea5933e294921e25ea2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  statevec_multiControlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask);</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> }</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  </div>
<div class="line"><a name="l01743"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b"> 1743</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b">statevec_swapQubitAmpsKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qb1, <span class="keywordtype">int</span> qb2) {</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  </div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  </div>
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 2; <span class="comment">// each iteration updates 2 amps and skips 2 amps</span></div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>  </div>
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00, ind01, ind10;</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re01, re10, im01, im10;</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  </div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  <span class="comment">// determine ind00 of |..0..0..>, |..0..1..> and |..1..0..></span></div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(thisTask, qb1, qb2);</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, qb1);</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, qb2);</div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  </div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  </div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="comment">// swap 01 and 10 amps</span></div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  reVec[ind01] = re10; reVec[ind10] = re01;</div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  imVec[ind01] = im10; imVec[ind10] = im01;</div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span> }</div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  </div>
<div class="line"><a name="l01769"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375"> 1769</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qb1, <span class="keywordtype">int</span> qb2) </div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span> {</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>2)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  statevec_swapQubitAmpsKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, qb1, qb2);</div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> }</div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  </div>
<div class="line"><a name="l01777"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afcf7b425ab92924c15b0b95b0d64c307"> 1777</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afcf7b425ab92924c15b0b95b0d64c307">statevec_hadamardKernel</a> (<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit){</div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  </div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  </div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  </div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  </div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  </div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> recRoot2 = 1.0/sqrt(2.0);</div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  </div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  </div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  </div>
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  </div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  </div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  stateVecReal[indexUp] = recRoot2*(stateRealUp + stateRealLo);</div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  stateVecImag[indexUp] = recRoot2*(stateImagUp + stateImagLo);</div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  </div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  stateVecReal[indexLo] = recRoot2*(stateRealUp - stateRealLo);</div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  stateVecImag[indexLo] = recRoot2*(stateImagUp - stateImagLo);</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span> }</div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  </div>
<div class="line"><a name="l01826"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#af3fc7bd149c70f083b149050242cd55e"> 1826</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#af3fc7bd149c70f083b149050242cd55e">statevec_hadamard</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit) </div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span> {</div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>  statevec_hadamardKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> }</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  </div>
<div class="line"><a name="l01834"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac15269559c1759a1a44971451874cea9"> 1834</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac15269559c1759a1a44971451874cea9">statevec_controlledNotKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span> {</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  </div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, <span class="comment">// storage for previous state values</span></div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  </div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  </div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  </div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  </div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  </div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  }</div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span> }</div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  </div>
<div class="line"><a name="l01873"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#abb2eab4af99adcc59be24f4c91c6f6ad"> 1873</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#abb2eab4af99adcc59be24f4c91c6f6ad">statevec_controlledNot</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> controlQubit, <span class="keywordtype">int</span> targetQubit)</div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span> {</div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  statevec_controlledNotKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit);</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span> }</div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  </div>
<div class="line"><a name="l01881"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac2d127c660168c2462601e4eca100740"> 1881</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac2d127c660168c2462601e4eca100740">statevec_multiControlledMultiQubitNotKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span> targMask) {</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  </div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  </div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  <span class="comment">// althouugh each thread swaps/updates two amplitudes, we still invoke one thread per amp</span></div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="keywordflow">if</span> (ampInd >= qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)</div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  </div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  <span class="comment">// modify amplitudes only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & ampInd) != ctrlMask))</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  </div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> mateInd = ampInd ^ targMask;</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  </div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <span class="comment">// if the mate is lower index, another thread is handling it</span></div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  <span class="keywordflow">if</span> (mateInd < ampInd)</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  </div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  <span class="comment">/* it may seem wasteful to spawn more threads than are needed, and abort </span></div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span> <span class="comment"> * half of them due to the amp pairing above (and potentially abort</span></div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span> <span class="comment"> * an exponential number due to ctrlMask). however, since we are moving </span></div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span> <span class="comment"> * global memory directly in a potentially non-contiguous fashoin, this </span></div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span> <span class="comment"> * method is likely to be memory bandwidth bottlenecked anyway </span></div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span> <span class="comment"> */</span></div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  </div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> mateRe = stateRe[mateInd];</div>
<div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> mateIm = stateIm[mateInd];</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>  </div>
<div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>  <span class="comment">// swap amp with mate</span></div>
<div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>  stateRe[mateInd] = stateRe[ampInd];</div>
<div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>  stateIm[mateInd] = stateIm[ampInd];</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  stateRe[ampInd] = mateRe;</div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  stateIm[ampInd] = mateIm;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span> }</div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  </div>
<div class="line"><a name="l01918"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a13ecc24b355a5213d745651cde56bd71"> 1918</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a13ecc24b355a5213d745651cde56bd71">statevec_multiControlledMultiQubitNot</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> ctrlMask, <span class="keywordtype">int</span> targMask) {</div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  </div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="keywordtype">int</span> numBlocks = ceil(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  statevec_multiControlledMultiQubitNotKernel<<<numBlocks, numThreadsPerBlock>>>(qureg, ctrlMask, targMask);</div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span> }</div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  </div>
<div class="line"><a name="l01925"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3"> 1925</a></span> __device__ __host__ <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> x )</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span> {</div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ans = 0 ;</div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  <span class="keywordflow">while</span>( x>>=1 ) ans++;</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  <span class="keywordflow">return</span> ans ;</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span> }</div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  </div>
<div class="line"><a name="l01932"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254"> 1932</a></span> __device__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *arrayIn, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, <span class="keywordtype">int</span> length){</div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="keywordtype">int</span> i, l, r;</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  <span class="keywordtype">int</span> threadMax, maxDepth;</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  threadMax = length/2;</div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  maxDepth = <a class="code" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a>(length/2);</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  </div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <span class="keywordflow">for</span> (i=0; i<maxDepth+1; i++){</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  <span class="keywordflow">if</span> (threadIdx.x<threadMax){</div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  l = threadIdx.x;</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  r = l + threadMax;</div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>  arrayIn[l] = arrayIn[r] + arrayIn[l];</div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  }</div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  threadMax = threadMax >> 1;</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  __syncthreads(); <span class="comment">// optimise -- use warp shuffle instead</span></div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  }</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>  </div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  <span class="keywordflow">if</span> (threadIdx.x==0) reducedArray[blockIdx.x] = arrayIn[0];</div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span> }</div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  </div>
<div class="line"><a name="l01951"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997"> 1951</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*arrayIn, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, <span class="keywordtype">int</span> length){</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keywordtype">int</span> blockOffset = blockIdx.x*length;</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  tempReductionArray[threadIdx.x*2] = arrayIn[blockOffset + threadIdx.x*2];</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  tempReductionArray[threadIdx.x*2+1] = arrayIn[blockOffset + threadIdx.x*2+1];</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>  __syncthreads();</div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, length);</div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span> }</div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>  </div>
<div class="line"><a name="l01960"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab558d79a6d1caa98999255246db6dcf2"> 1960</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab558d79a6d1caa98999255246db6dcf2">densmatr_findProbabilityOfZeroKernel</a>(</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray</div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span> ) {</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="comment">// run by each thread</span></div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>  <span class="comment">// use of block here refers to contiguous amplitudes where measureQubit = 0, </span></div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  <span class="comment">// (then =1) and NOT the CUDA block, which is the partitioning of CUDA threads</span></div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  </div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = densityDim >> 1;</div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeHalfBlock = 1LL << (measureQubit);</div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  </div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock; <span class="comment">// which block this thread is processing</span></div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// which part of the block this thread is processing</span></div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> basisIndex; <span class="comment">// index of this thread's computational basis state</span></div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityIndex; <span class="comment">// " " index of |basis><basis| in the flat density matrix</span></div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  </div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  </div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  <span class="comment">// figure out which density matrix prob that this thread is assigned</span></div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  basisIndex = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  densityIndex = (densityDim + 1) * basisIndex;</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  </div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  <span class="comment">// record the probability in the CUDA-BLOCK-wide array</span></div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[densityIndex]; <span class="comment">// im[densityIndex] assumed ~ 0</span></div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  tempReductionArray[threadIdx.x] = prob;</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  </div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  <span class="comment">// sum the probs collected by this CUDA-BLOCK's threads into a per-CUDA-BLOCK array</span></div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  __syncthreads();</div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  }</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span> }</div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  </div>
<div class="line"><a name="l01998"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#acd94d5e3794824e757731e50d3d018c6"> 1998</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#acd94d5e3794824e757731e50d3d018c6">statevec_findProbabilityOfZeroKernel</a>(</div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray</div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span> ) {</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  </div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  </div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  </div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  </div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  </div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  </div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  </div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realVal, imagVal;</div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  realVal = stateVecReal[index];</div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  imagVal = stateVecImag[index]; </div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  tempReductionArray[threadIdx.x] = realVal*realVal + imagVal*imagVal;</div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  __syncthreads();</div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  </div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>  }</div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> }</div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  </div>
<div class="line"><a name="l02048"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377"> 2048</a></span> <span class="keywordtype">int</span> <a class="code" href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377">getNumReductionLevels</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce, <span class="keywordtype">int</span> numReducedPerLevel){</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  <span class="keywordtype">int</span> levels=0;</div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordflow">while</span> (numValuesToReduce){</div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  numValuesToReduce = numValuesToReduce/numReducedPerLevel;</div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  levels++;</div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  }</div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keywordflow">return</span> levels;</div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span> }</div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  </div>
<div class="line"><a name="l02057"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b"> 2057</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **a, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **b){</div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *temp;</div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  temp = *a;</div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  *a = *b;</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  *b = temp;</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span> }</div>
<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  </div>
<div class="line"><a name="l02064"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d"> 2064</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d">densmatr_findProbabilityOfZero</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit)</div>
<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span> {</div>
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = densityDim >> 1; <span class="comment">// half of the diagonal has measureQubit=0</span></div>
<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  </div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  </div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  </div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  }</div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  }</div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  </div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>  </div>
<div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  densmatr_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  firstTime = 0;</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  </div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  }</div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  </div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  }</div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  </div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> zeroProb;</div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  cudaMemcpy(&zeroProb, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  <span class="keywordflow">return</span> zeroProb;</div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span> }</div>
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  </div>
<div class="line"><a name="l02112"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238"> 2112</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238">statevec_findProbabilityOfZero</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit)</div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> {</div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateProb=0;</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  <span class="keywordtype">int</span> firstTime=1;</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  </div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  <span class="keywordflow">while</span>(numValuesToReduce>1){ </div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  <span class="keywordflow">if</span> (numValuesToReduce<maxReducedPerLevel){</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  <span class="comment">// Need less than one CUDA block to reduce values</span></div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  <span class="comment">// Use full CUDA blocks, with block size constrained by shared mem usage</span></div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  }</div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  </div>
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  <span class="keywordflow">if</span> (firstTime){</div>
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  statevec_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  firstTime=0;</div>
<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>  }</div>
<div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>  }</div>
<div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>  cudaMemcpy(&stateProb, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>  <span class="keywordflow">return</span> stateProb;</div>
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span> }</div>
<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  </div>
<div class="line"><a name="l02150"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a63cb88a5f4eb12fef087435b8db3f8eb"> 2150</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a63cb88a5f4eb12fef087435b8db3f8eb">statevec_calcProbOfOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome)</div>
<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span> {</div>
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238">statevec_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>  <span class="keywordflow">if</span> (outcome==1)</div>
<div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> }</div>
<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  </div>
<div class="line"><a name="l02158"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae37b3eff5d3affbc1edfe216cabc1c53"> 2158</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ae37b3eff5d3affbc1edfe216cabc1c53">densmatr_calcProbOfOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome)</div>
<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span> {</div>
<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d">densmatr_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordflow">if</span> (outcome==1) </div>
<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span> }</div>
<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  </div>
<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span> <span class="comment">// atomicAdd on floats/doubles isn't available on <6 CC devices, so we add it ourselves</span></div>
<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span> <span class="preprocessor">#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 600</span></div>
<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span> <span class="preprocessor">#else</span></div>
<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span> <span class="keyword">static</span> __inline__ __device__ <span class="keywordtype">double</span> atomicAdd(<span class="keywordtype">double</span>* address, <span class="keywordtype">double</span> val)</div>
<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span> {</div>
<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* address_as_ull = (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>*) address;</div>
<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> old = *address_as_ull, assumed;</div>
<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  </div>
<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  <span class="keywordflow">do</span> {</div>
<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  assumed = old;</div>
<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  old = atomicCAS(address_as_ull, assumed,</div>
<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  __double_as_longlong(val + __longlong_as_double(assumed)));</div>
<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>  </div>
<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>  <span class="comment">// Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN)</span></div>
<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  } <span class="keywordflow">while</span> (assumed != old);</div>
<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  </div>
<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  <span class="keywordflow">return</span> __longlong_as_double(old);</div>
<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span> }</div>
<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span> <span class="preprocessor">#endif</span></div>
<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  </div>
<div class="line"><a name="l02186"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab2ffd422f8c4e334277263bb4efe2a61"> 2186</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab2ffd422f8c4e334277263bb4efe2a61">statevec_calcProbOfAllOutcomesKernel</a>(</div>
<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* outcomeProbs, <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span> numQubits</div>
<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span> ) {</div>
<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  <span class="comment">// each thread handles one amplitude (all amplitudes are involved)</span></div>
<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <span class="keywordflow">if</span> (ampInd >= qureg.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  </div>
<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob = (</div>
<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd]*qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] + </div>
<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd]*qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd]);</div>
<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  </div>
<div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>  <span class="comment">// each amplitude contributes to one outcome</span></div>
<div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outcomeInd = 0;</div>
<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits; q++)</div>
<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  outcomeInd += <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], ampInd) * (1LL << q);</div>
<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  </div>
<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  <span class="comment">// each thread atomically writes directly to the global output.</span></div>
<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <span class="comment">// this beat block-heirarchal atomic reductions in both global and shared memory!</span></div>
<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  atomicAdd(&outcomeProbs[outcomeInd], prob);</div>
<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span> }</div>
<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  </div>
<div class="line"><a name="l02207"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afd14cca643241a991ac172a826311eca"> 2207</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afd14cca643241a991ac172a826311eca">statevec_calcProbOfAllOutcomes</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* outcomeProbs, <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span> numQubits) {</div>
<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  </div>
<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  <span class="comment">// copy qubits to GPU memory</span></div>
<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  <span class="keywordtype">int</span>* d_qubits;</div>
<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="keywordtype">size_t</span> mem_qubits = numQubits * <span class="keyword">sizeof</span> *d_qubits;</div>
<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  </div>
<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="comment">// create one thread for every amplitude</span></div>
<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  <span class="keywordtype">int</span> numBlocks = ceil(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  </div>
<div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>  <span class="comment">// create global GPU array for outcomeProbs</span></div>
<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_outcomeProbs;</div>
<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numOutcomes = (1LL << numQubits);</div>
<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  <span class="keywordtype">size_t</span> mem_outcomeProbs = numOutcomes * <span class="keyword">sizeof</span> *d_outcomeProbs;</div>
<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  cudaMalloc(&d_outcomeProbs, mem_outcomeProbs);</div>
<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  cudaMemset(d_outcomeProbs, 0, mem_outcomeProbs);</div>
<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>  </div>
<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>  <span class="comment">// populate per-block subarrays</span></div>
<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  statevec_calcProbOfAllOutcomesKernel<<<numBlocks, numThreadsPerBlock>>>(</div>
<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  d_outcomeProbs, qureg, d_qubits, numQubits);</div>
<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  </div>
<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  <span class="comment">// copy outcomeProbs from GPU memory</span></div>
<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  cudaMemcpy(outcomeProbs, d_outcomeProbs, mem_outcomeProbs, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  </div>
<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  <span class="comment">// free GPU memory</span></div>
<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  cudaFree(d_outcomeProbs);</div>
<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span> }</div>
<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  </div>
<div class="line"><a name="l02238"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afcb85940a9f204f77006c3644bd8c13e"> 2238</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afcb85940a9f204f77006c3644bd8c13e">densmatr_calcProbOfAllOutcomesKernel</a>(</div>
<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* outcomeProbs, <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span> numQubits</div>
<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span> ) {</div>
<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>  <span class="comment">// each thread handles one diagonal amplitude</span></div>
<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numDiags = (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>  <span class="keywordflow">if</span> (diagInd >= numDiags) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  </div>
<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> flatInd = (1 + numDiags)*diagInd;</div>
<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[flatInd]; <span class="comment">// im[flatInd] assumed ~ 0</span></div>
<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  </div>
<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  <span class="comment">// each diagonal amplitude contributes to one outcome</span></div>
<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outcomeInd = 0;</div>
<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits; q++)</div>
<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  outcomeInd += <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], diagInd) * (1LL << q);</div>
<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  </div>
<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  <span class="comment">// each thread atomically writes directly to the global output.</span></div>
<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <span class="comment">// this beat block-heirarchal atomic reductions in both global and shared memory!</span></div>
<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  atomicAdd(&outcomeProbs[outcomeInd], prob);</div>
<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span> }</div>
<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  </div>
<div class="line"><a name="l02259"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a96460613669152314d4680a8603af650"> 2259</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a96460613669152314d4680a8603af650">densmatr_calcProbOfAllOutcomes</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* outcomeProbs, <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span> numQubits) {</div>
<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  </div>
<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  <span class="comment">// copy qubits to GPU memory</span></div>
<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="keywordtype">int</span>* d_qubits;</div>
<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="keywordtype">size_t</span> mem_qubits = numQubits * <span class="keyword">sizeof</span> *d_qubits;</div>
<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>  </div>
<div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>  <span class="comment">// create global array, with per-block subarrays</span></div>
<div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  <span class="keywordtype">int</span> numThreadsPerBlock = 128;</div>
<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  <span class="keywordtype">int</span> numDiags = (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="keywordtype">int</span> numBlocks = ceil(numDiags / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) numThreadsPerBlock);</div>
<div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>  </div>
<div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>  <span class="comment">// create global GPU array for outcomeProbs</span></div>
<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_outcomeProbs;</div>
<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numOutcomes = (1LL << numQubits);</div>
<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  <span class="keywordtype">size_t</span> mem_outcomeProbs = numOutcomes * <span class="keyword">sizeof</span> *d_outcomeProbs;</div>
<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  cudaMalloc(&d_outcomeProbs, mem_outcomeProbs);</div>
<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  cudaMemset(d_outcomeProbs, 0, mem_outcomeProbs);</div>
<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  </div>
<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  <span class="comment">// populate per-block subarrays</span></div>
<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  densmatr_calcProbOfAllOutcomesKernel<<<numBlocks, numThreadsPerBlock>>>(</div>
<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  d_outcomeProbs, qureg, d_qubits, numQubits);</div>
<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  </div>
<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  <span class="comment">// copy outcomeProbs from GPU memory</span></div>
<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  cudaMemcpy(outcomeProbs, d_outcomeProbs, mem_outcomeProbs, cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  </div>
<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  <span class="comment">// free GPU memory</span></div>
<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  cudaFree(d_outcomeProbs);</div>
<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span> }</div>
<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  </div>
<div class="line"><a name="l02292"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32"> 2292</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">densmatr_calcInnerProductKernel</a>(</div>
<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>  <a class="code" href="structQureg.html">Qureg</a> a, <a class="code" href="structQureg.html">Qureg</a> b, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTermsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray</div>
<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> ) { </div>
<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>  </div>
<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  <span class="comment">// Re{ conj(a) b } = Re{ (aRe - i aIm)(bRe + i bIm) } = aRe bRe + aIm bIm</span></div>
<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prod = (</div>
<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index]*b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] </div>
<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  + a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]*b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]);</div>
<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  </div>
<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  tempReductionArray[threadIdx.x] = prod;</div>
<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  __syncthreads();</div>
<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  </div>
<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span> }</div>
<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  </div>
<div class="line"><a name="l02313"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0"> 2313</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0">densmatr_calcInnerProduct</a>(<a class="code" href="structQureg.html">Qureg</a> a, <a class="code" href="structQureg.html">Qureg</a> b) {</div>
<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  </div>
<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = a.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>;</div>
<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  </div>
<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>  </div>
<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  </div>
<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  }</div>
<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  }</div>
<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>  </div>
<div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>  <span class="comment">// spawn threads to sum the terms in each block</span></div>
<div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>  <span class="comment">// arbitrarily store the reduction in the b qureg's array</span></div>
<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  densmatr_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  a, b, a.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>, b.firstLevelReduction);</div>
<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  firstTime = 0;</div>
<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  } </div>
<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  <span class="comment">// sum the block terms</span></div>
<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  b.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(b.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  }</div>
<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  </div>
<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  }</div>
<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  </div>
<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerprod;</div>
<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  cudaMemcpy(&innerprod, b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>  <span class="keywordflow">return</span> innerprod;</div>
<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> }</div>
<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  </div>
<div class="line"><a name="l02363"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd"> 2363</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">statevec_calcInnerProductKernel</a>(</div>
<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <span class="keywordtype">int</span> getRealComp,</div>
<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal1, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag1, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag2, </div>
<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTermsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray) </div>
<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> {</div>
<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  </div>
<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  <span class="comment">// choose whether to calculate the real or imaginary term of the inner product</span></div>
<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdTerm;</div>
<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  innerProdTerm = vecReal1[index]*vecReal2[index] + vecImag1[index]*vecImag2[index];</div>
<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  innerProdTerm = vecReal1[index]*vecImag2[index] - vecImag1[index]*vecReal2[index];</div>
<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  </div>
<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  tempReductionArray[threadIdx.x] = innerProdTerm;</div>
<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  __syncthreads();</div>
<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  </div>
<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> }</div>
<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  </div>
<div class="line"><a name="l02393"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0"> 2393</a></span> <a class="code" href="structComplex.html">Complex</a> <a class="code" href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">statevec_calcInnerProduct</a>(<a class="code" href="structQureg.html">Qureg</a> bra, <a class="code" href="structQureg.html">Qureg</a> ket) {</div>
<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  </div>
<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdReal, innerProdImag;</div>
<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  </div>
<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>  </div>
<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  getRealComp = 1;</div>
<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  firstTime = 1;</div>
<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  }</div>
<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  }</div>
<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  getRealComp,</div>
<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  numValuesToReduce, </div>
<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  firstTime = 0;</div>
<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>  }</div>
<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>  }</div>
<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>  cudaMemcpy(&innerProdReal, bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>  </div>
<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>  getRealComp = 0;</div>
<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  firstTime = 1;</div>
<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  }</div>
<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>  }</div>
<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  getRealComp,</div>
<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, bra.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>  ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, ket.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>  numValuesToReduce, </div>
<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  firstTime = 0;</div>
<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  }</div>
<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  }</div>
<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>  cudaMemcpy(&innerProdImag, bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  </div>
<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  <a class="code" href="structComplex.html">Complex</a> innerProd;</div>
<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  innerProd.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = innerProdReal;</div>
<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>  innerProd.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = innerProdImag;</div>
<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>  <span class="keywordflow">return</span> innerProd;</div>
<div class="line"><a name="l02478"></a><span class="lineno"> 2478</span> }</div>
<div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>  </div>
<div class="line"><a name="l02481"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae"> 2481</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">densmatr_calcFidelityKernel</a>(<a class="code" href="structQureg.html">Qureg</a> dens, <a class="code" href="structQureg.html">Qureg</a> vec, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> dim, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray) {</div>
<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  </div>
<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  <span class="comment">// figure out which density matrix row to consider</span></div>
<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col;</div>
<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> row = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  <span class="keywordflow">if</span> (row >= dim) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  </div>
<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densReal = dens.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densImag = dens.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal = vec.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag = vec.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  </div>
<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  <span class="comment">// compute the row-th element of the product dens*vec</span></div>
<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodReal = 0;</div>
<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodImag = 0;</div>
<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  <span class="keywordflow">for</span> (col=0LL; col < dim; col++) {</div>
<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemReal = densReal[dim*col + row];</div>
<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemImag = densImag[dim*col + row];</div>
<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>  </div>
<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>  prodReal += densElemReal*vecReal[col] - densElemImag*vecImag[col];</div>
<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  prodImag += densElemReal*vecImag[col] + densElemImag*vecReal[col];</div>
<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  }</div>
<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  </div>
<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  <span class="comment">// multiply with row-th elem of (vec^*)</span></div>
<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> termReal = prodImag*vecImag[row] + prodReal*vecReal[row];</div>
<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>  </div>
<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>  <span class="comment">// imag of every term should be zero, because each is a valid fidelity calc of an eigenstate</span></div>
<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="comment">//qreal termImag = prodImag*vecReal[row] - prodReal*vecImag[row];</span></div>
<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  </div>
<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  tempReductionArray[threadIdx.x] = termReal;</div>
<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  __syncthreads();</div>
<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  </div>
<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span> }</div>
<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  </div>
<div class="line"><a name="l02519"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf"> 2519</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf">densmatr_calcFidelity</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structQureg.html">Qureg</a> pureState) {</div>
<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  </div>
<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = densityDim;</div>
<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>  </div>
<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  </div>
<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>  </div>
<div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>  }</div>
<div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>  }</div>
<div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>  </div>
<div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  <span class="comment">// store the reduction in the pureState array</span></div>
<div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>  densmatr_calcFidelityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  qureg, pureState, densityDim, pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  firstTime = 0;</div>
<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  </div>
<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  pureState.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(pureState.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  }</div>
<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  </div>
<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  }</div>
<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  </div>
<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fidelity;</div>
<div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>  cudaMemcpy(&fidelity, pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  <span class="keywordflow">return</span> fidelity;</div>
<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span> }</div>
<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  </div>
<div class="line"><a name="l02569"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2"> 2569</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2">densmatr_calcHilbertSchmidtDistanceSquaredKernel</a>(</div>
<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* aRe, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* aIm, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* bRe, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* bIm, </div>
<div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray</div>
<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span> ) {</div>
<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  </div>
<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="comment">// compute this thread's sum term</span></div>
<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difRe = aRe[index] - bRe[index];</div>
<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difIm = aIm[index] - bIm[index];</div>
<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> term = difRe*difRe + difIm*difIm;</div>
<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>  </div>
<div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  <span class="comment">// array of each thread's collected term, to be summed</span></div>
<div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  __syncthreads();</div>
<div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  </div>
<div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span> }</div>
<div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>  </div>
<div class="line"><a name="l02592"></a><span class="lineno"> 2592</span> <span class="comment">/* computes sqrt(Tr( (a-b) conjTrans(a-b) ) = sqrt( sum of abs vals of (a-b)) */</span></div>
<div class="line"><a name="l02593"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5"> 2593</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5">densmatr_calcHilbertSchmidtDistance</a>(<a class="code" href="structQureg.html">Qureg</a> a, <a class="code" href="structQureg.html">Qureg</a> b) {</div>
<div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>  </div>
<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="comment">// we're summing the square of every term in (a-b)</span></div>
<div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = a.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  </div>
<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  </div>
<div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  </div>
<div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  }</div>
<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>  }</div>
<div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  </div>
<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  <span class="comment">// spawn threads to sum the probs in each block (store reduction temp values in a's reduction array)</span></div>
<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  densmatr_calcHilbertSchmidtDistanceSquaredKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, a.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, b.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  numValuesToReduce, a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  firstTime = 0;</div>
<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  </div>
<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  a.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(a.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  }</div>
<div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  </div>
<div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  }</div>
<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>  </div>
<div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace;</div>
<div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>  cudaMemcpy(&trace, a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>  </div>
<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sqrtTrace = sqrt(trace);</div>
<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  <span class="keywordflow">return</span> sqrtTrace;</div>
<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span> }</div>
<div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  </div>
<div class="line"><a name="l02645"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5"> 2645</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5">densmatr_calcPurityKernel</a>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray) {</div>
<div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>  </div>
<div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>  </div>
<div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> term = vecReal[index]*vecReal[index] + vecImag[index]*vecImag[index];</div>
<div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>  </div>
<div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  __syncthreads();</div>
<div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  </div>
<div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span> }</div>
<div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>  </div>
<div class="line"><a name="l02664"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f"> 2664</a></span> <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> <a class="code" href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">densmatr_calcPurity</a>(<a class="code" href="structQureg.html">Qureg</a> qureg) {</div>
<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  </div>
<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  </div>
<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  <span class="keywordtype">int</span> maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  </div>
<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  </div>
<div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>  }</div>
<div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  }</div>
<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  </div>
<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  densmatr_calcPurityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  numValuesToReduce, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  firstTime = 0;</div>
<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  </div>
<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>  }</div>
<div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>  </div>
<div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>  }</div>
<div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  </div>
<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> traceDensSquared;</div>
<div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>  cudaMemcpy(&traceDensSquared, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>  <span class="keywordflow">return</span> traceDensSquared;</div>
<div class="line"><a name="l02711"></a><span class="lineno"> 2711</span> }</div>
<div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  </div>
<div class="line"><a name="l02713"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879"> 2713</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879">statevec_collapseToKnownProbOutcomeKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability)</div>
<div class="line"><a name="l02714"></a><span class="lineno"> 2714</span> {</div>
<div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> renorm; <span class="comment">// probability (returned) value</span></div>
<div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  </div>
<div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>  </div>
<div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>  </div>
<div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  renorm=1/sqrt(totalProbability);</div>
<div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  </div>
<div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>  </div>
<div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  <span class="keywordflow">if</span> (outcome==0){</div>
<div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  stateVecReal[index]=stateVecReal[index]*renorm;</div>
<div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  stateVecImag[index]=stateVecImag[index]*renorm;</div>
<div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  </div>
<div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  stateVecReal[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  stateVecImag[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (outcome==1){</div>
<div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>  stateVecReal[index]=0;</div>
<div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  stateVecImag[index]=0;</div>
<div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  </div>
<div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>  stateVecReal[index+sizeHalfBlock]=stateVecReal[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>  stateVecImag[index+sizeHalfBlock]=stateVecImag[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>  }</div>
<div class="line"><a name="l02764"></a><span class="lineno"> 2764</span> }</div>
<div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>  </div>
<div class="line"><a name="l02766"></a><span class="lineno"> 2766</span> <span class="comment">/*</span></div>
<div class="line"><a name="l02767"></a><span class="lineno"> 2767</span> <span class="comment"> * outcomeProb must accurately be the probability of that qubit outcome in the state-vector, or</span></div>
<div class="line"><a name="l02768"></a><span class="lineno"> 2768</span> <span class="comment"> * else the state-vector will lose normalisation</span></div>
<div class="line"><a name="l02769"></a><span class="lineno"> 2769</span> <span class="comment"> */</span></div>
<div class="line"><a name="l02770"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a008becc4a18f868340836e0ab9fd6df6"> 2770</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a008becc4a18f868340836e0ab9fd6df6">statevec_collapseToKnownProbOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb)</div>
<div class="line"><a name="l02771"></a><span class="lineno"> 2771</span> { </div>
<div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1)/threadsPerCUDABlock);</div>
<div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  statevec_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, measureQubit, outcome, outcomeProb);</div>
<div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> }</div>
<div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>  </div>
<div class="line"><a name="l02779"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293"> 2779</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">densmatr_collapseToKnownProbOutcomeKernel</a>(</div>
<div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBasesToVisit,</div>
<div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> desired, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> undesired) </div>
<div class="line"><a name="l02783"></a><span class="lineno"> 2783</span> {</div>
<div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  <span class="keywordflow">if</span> (scanInd >= numBasesToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  </div>
<div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> base = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  </div>
<div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>  <span class="comment">// renormalise desired outcome</span></div>
<div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  vecReal[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  vecImag[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  </div>
<div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  <span class="comment">// kill undesired outcome</span></div>
<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  vecReal[base + undesired] = 0;</div>
<div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  vecImag[base + undesired] = 0;</div>
<div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>  </div>
<div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>  <span class="comment">// kill |..0..><..1..| states</span></div>
<div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>  vecReal[base + colBit] = 0;</div>
<div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>  vecImag[base + colBit] = 0;</div>
<div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  vecReal[base + rowBit] = 0;</div>
<div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  vecImag[base + rowBit] = 0;</div>
<div class="line"><a name="l02802"></a><span class="lineno"> 2802</span> }</div>
<div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>  </div>
<div class="line"><a name="l02805"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5658f2ecbbd4ea425db5f7dc7fc4ba92"> 2805</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5658f2ecbbd4ea425db5f7dc7fc4ba92">densmatr_collapseToKnownProbOutcome</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> measureQubit, <span class="keywordtype">int</span> outcome, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb) {</div>
<div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  </div>
<div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>  <span class="keywordtype">int</span> rowQubit = measureQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  </div>
<div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  <span class="keywordtype">int</span> colBit = 1LL << measureQubit;</div>
<div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  </div>
<div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBasesToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit -1; </div>
<div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numBasesToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>  </div>
<div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> desired, undesired;</div>
<div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  <span class="keywordflow">if</span> (outcome == 0) {</div>
<div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  desired = 0;</div>
<div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  undesired = colBit | rowBit;</div>
<div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  desired = colBit | rowBit;</div>
<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  undesired = 0;</div>
<div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  }</div>
<div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  </div>
<div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  CUDABlocks = ceil(numBasesToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  densmatr_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>  outcomeProb, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numBasesToVisit,</div>
<div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>  part1, part2, part3, rowBit, colBit, desired, undesired);</div>
<div class="line"><a name="l02832"></a><span class="lineno"> 2832</span> }</div>
<div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>  </div>
<div class="line"><a name="l02834"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef"> 2834</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef">densmatr_mixDensityMatrixKernel</a>(<a class="code" href="structQureg.html">Qureg</a> combineQureg, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="code" href="structQureg.html">Qureg</a> otherQureg, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit) {</div>
<div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>  </div>
<div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  </div>
<div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  </div>
<div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] += otherProb*otherQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd];</div>
<div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd] += otherProb*otherQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd];</div>
<div class="line"><a name="l02844"></a><span class="lineno"> 2844</span> }</div>
<div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  </div>
<div class="line"><a name="l02846"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe"> 2846</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe">densmatr_mixDensityMatrix</a>(<a class="code" href="structQureg.html">Qureg</a> combineQureg, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="code" href="structQureg.html">Qureg</a> otherQureg) {</div>
<div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  </div>
<div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = combineQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  </div>
<div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>  densmatr_mixDensityMatrixKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  combineQureg, otherProb, otherQureg, numAmpsToVisit</div>
<div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>  );</div>
<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span> }</div>
<div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  </div>
<div class="line"><a name="l02863"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952"> 2863</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">densmatr_mixDephasingKernel</a>(</div>
<div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit)</div>
<div class="line"><a name="l02867"></a><span class="lineno"> 2867</span> {</div>
<div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>  </div>
<div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>  vecReal[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  vecImag[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  vecReal[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>  vecImag[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02876"></a><span class="lineno"> 2876</span> }</div>
<div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>  </div>
<div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  </div>
<div class="line"><a name="l02879"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5"> 2879</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac) {</div>
<div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  </div>
<div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  </div>
<div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>  </div>
<div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit - 1;</div>
<div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numAmpsToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>  </div>
<div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>  densmatr_mixDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>  dephFac, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  part1, part2, part3, colBit, rowBit);</div>
<div class="line"><a name="l02897"></a><span class="lineno"> 2897</span> }</div>
<div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  </div>
<div class="line"><a name="l02899"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1"> 2899</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase) {</div>
<div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  </div>
<div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  </div>
<div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>  <a class="code" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephFac);</div>
<div class="line"><a name="l02906"></a><span class="lineno"> 2906</span> }</div>
<div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>  </div>
<div class="line"><a name="l02914"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924"> 2914</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">densmatr_mixTwoQubitDephasingKernel</a>(</div>
<div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBackgroundStates, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5,</div>
<div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit2) </div>
<div class="line"><a name="l02918"></a><span class="lineno"> 2918</span> {</div>
<div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>  <span class="keywordflow">if</span> (outerInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  </div>
<div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>  <span class="comment">// sets meta in 1...14 excluding 5, 10, creating bit string DCBA for |..D..C..><..B..A|</span></div>
<div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  <span class="keywordtype">int</span> meta = 1 + (outerInd/numBackgroundStates);</div>
<div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  <span class="keywordflow">if</span> (meta > 4) meta++;</div>
<div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  <span class="keywordflow">if</span> (meta > 9) meta++;</div>
<div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  </div>
<div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> shift = rowBit2*((meta>>3)%2) + rowBit1*((meta>>2)%2) + colBit2*((meta>>1)%2) + colBit1*(meta%2);</div>
<div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = outerInd % numBackgroundStates;</div>
<div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd = (</div>
<div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>  shift + </div>
<div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>  (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2) + ((scanInd&part4)<<3) + ((scanInd&part5)<<4));</div>
<div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>  </div>
<div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>  vecReal[stateInd] *= fac;</div>
<div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>  vecImag[stateInd] *= fac;</div>
<div class="line"><a name="l02935"></a><span class="lineno"> 2935</span> }</div>
<div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>  </div>
<div class="line"><a name="l02937"></a><span class="lineno"> 2937</span> <span class="comment">// @TODO is separating these 12 amplitudes really faster than letting every 16th base modify 12 elems?</span></div>
<div class="line"><a name="l02938"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289"> 2938</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qubit1, <span class="keywordtype">int</span> qubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase) {</div>
<div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>  </div>
<div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>  </div>
<div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>  </div>
<div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>  </div>
<div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit1 = 1LL << qubit1;</div>
<div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit1 = 1LL << rowQubit1;</div>
<div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit2 = 1LL << qubit2;</div>
<div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit2 = 1LL << rowQubit2;</div>
<div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  </div>
<div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit1 - 1;</div>
<div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (colBit2 >> 1) - colBit1;</div>
<div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = (rowBit1 >> 2) - (colBit2 >> 1);</div>
<div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4 = (rowBit2 >> 3) - (rowBit1 >> 2);</div>
<div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5 = (qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/16) - (rowBit2 >> 3);</div>
<div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  </div>
<div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>  <span class="comment">// refers to states |a 0 b 0 c><d 0 e 0 f| (target qubits are fixed)</span></div>
<div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numBackgroundStates = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/16;</div>
<div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>  </div>
<div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>  <span class="comment">// 12 of these states experience dephasing</span></div>
<div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = 12 * numBackgroundStates;</div>
<div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>  </div>
<div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>  densmatr_mixTwoQubitDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>  dephFac, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numBackgroundStates, numAmpsToVisit,</div>
<div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>  part1, part2, part3, part4, part5, colBit1, rowBit1, colBit2, rowBit2);</div>
<div class="line"><a name="l02972"></a><span class="lineno"> 2972</span> }</div>
<div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  </div>
<div class="line"><a name="l02975"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb"> 2975</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">densmatr_mixDepolarisingKernel</a>(</div>
<div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits)</div>
<div class="line"><a name="l02979"></a><span class="lineno"> 2979</span> {</div>
<div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>  </div>
<div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> baseInd = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> targetInd = baseInd + bothBits;</div>
<div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>  </div>
<div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = depolLevel * 0.5 * (vecReal[baseInd] + vecReal[targetInd]);</div>
<div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = depolLevel * 0.5 * (vecImag[baseInd] + vecImag[targetInd]);</div>
<div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>  </div>
<div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>  vecReal[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  vecImag[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  vecReal[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>  vecImag[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  </div>
<div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>  vecReal[targetInd] += realAvDepol;</div>
<div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>  vecImag[targetInd] += imagAvDepol;</div>
<div class="line"><a name="l02998"></a><span class="lineno"> 2998</span> }</div>
<div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>  </div>
<div class="line"><a name="l03001"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b"> 3001</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">densmatr_mixDampingKernel</a>(</div>
<div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits)</div>
<div class="line"><a name="l03005"></a><span class="lineno"> 3005</span> {</div>
<div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>  </div>
<div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> baseInd = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2);</div>
<div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> targetInd = baseInd + bothBits;</div>
<div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>  </div>
<div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = damping * ( vecReal[targetInd]);</div>
<div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = damping * ( vecImag[targetInd]);</div>
<div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>  </div>
<div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  vecReal[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  vecImag[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  </div>
<div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l03020"></a><span class="lineno"> 3020</span> }</div>
<div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>  </div>
<div class="line"><a name="l03022"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a398b60c4cb4fa2cf2ffc126de6c08da0"> 3022</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a398b60c4cb4fa2cf2ffc126de6c08da0">densmatr_mixDepolarising</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel) {</div>
<div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  </div>
<div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  </div>
<div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  <a class="code" href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a>(qureg, targetQubit, depolLevel);</div>
<div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>  </div>
<div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>  </div>
<div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits = colBit | rowBit;</div>
<div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>  </div>
<div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit - 1;</div>
<div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numAmpsToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>  </div>
<div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>  densmatr_mixDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  depolLevel, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l03046"></a><span class="lineno"> 3046</span> }</div>
<div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>  </div>
<div class="line"><a name="l03048"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac501fe7b9d331be48359ce1546348f97"> 3048</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac501fe7b9d331be48359ce1546348f97">densmatr_mixDamping</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> targetQubit, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping) {</div>
<div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  </div>
<div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  <span class="keywordflow">if</span> (damping == 0)</div>
<div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>  </div>
<div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase = sqrt(1-damping);</div>
<div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>  <a class="code" href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephase);</div>
<div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>  </div>
<div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/4;</div>
<div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>  </div>
<div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> bothBits = colBit | rowBit;</div>
<div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  </div>
<div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit - 1;</div>
<div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (rowBit >> 1) - colBit;</div>
<div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = numAmpsToVisit - (rowBit >> 1);</div>
<div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  </div>
<div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>  densmatr_mixDampingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>  damping, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l03073"></a><span class="lineno"> 3073</span> }</div>
<div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>  </div>
<div class="line"><a name="l03076"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612"> 3076</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">densmatr_mixTwoQubitDepolarisingKernel</a>(</div>
<div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit,</div>
<div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3, </div>
<div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5,</div>
<div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol1, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol2)</div>
<div class="line"><a name="l03081"></a><span class="lineno"> 3081</span> {</div>
<div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> scanInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  </div>
<div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  <span class="comment">// index of |..0..0..><..0..0|</span></div>
<div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00 = (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2) + ((scanInd&part4)<<3) + ((scanInd&part5)<<4);</div>
<div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind01 = ind00 + rowCol1;</div>
<div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind10 = ind00 + rowCol2;</div>
<div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind11 = ind00 + rowCol1 + rowCol2;</div>
<div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>  </div>
<div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  vecReal[ind00] + vecReal[ind01] + vecReal[ind10] + vecReal[ind11]);</div>
<div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  vecImag[ind00] + vecImag[ind01] + vecImag[ind10] + vecImag[ind11]);</div>
<div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  </div>
<div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain = 1 - depolLevel;</div>
<div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  vecReal[ind00] *= retain; vecImag[ind00] *= retain;</div>
<div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>  vecReal[ind01] *= retain; vecImag[ind01] *= retain;</div>
<div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>  vecReal[ind10] *= retain; vecImag[ind10] *= retain;</div>
<div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>  vecReal[ind11] *= retain; vecImag[ind11] *= retain;</div>
<div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>  </div>
<div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>  vecReal[ind00] += realAvDepol; vecImag[ind00] += imagAvDepol;</div>
<div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>  vecReal[ind01] += realAvDepol; vecImag[ind01] += imagAvDepol;</div>
<div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  vecReal[ind10] += realAvDepol; vecImag[ind10] += imagAvDepol;</div>
<div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>  vecReal[ind11] += realAvDepol; vecImag[ind11] += imagAvDepol;</div>
<div class="line"><a name="l03106"></a><span class="lineno"> 3106</span> }</div>
<div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>  </div>
<div class="line"><a name="l03108"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6"> 3108</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6">densmatr_mixTwoQubitDepolarising</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span> qubit1, <span class="keywordtype">int</span> qubit2, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel) {</div>
<div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  </div>
<div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  </div>
<div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  </div>
<div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>  <a class="code" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a>(qureg, qubit1, qubit2, depolLevel);</div>
<div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>  </div>
<div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>  </div>
<div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit1 = 1LL << qubit1;</div>
<div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit1 = 1LL << rowQubit1;</div>
<div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit2 = 1LL << qubit2;</div>
<div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowBit2 = 1LL << rowQubit2;</div>
<div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>  </div>
<div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol1 = colBit1 | rowBit1;</div>
<div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowCol2 = colBit2 | rowBit2;</div>
<div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>  </div>
<div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>/16;</div>
<div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part1 = colBit1 - 1;</div>
<div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part2 = (colBit2 >> 1) - colBit1;</div>
<div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part3 = (rowBit1 >> 2) - (colBit2 >> 1);</div>
<div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part4 = (rowBit2 >> 3) - (rowBit1 >> 2);</div>
<div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> part5 = numAmpsToVisit - (rowBit2 >> 3);</div>
<div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>  </div>
<div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>  densmatr_mixTwoQubitDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>  depolLevel, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, numAmpsToVisit,</div>
<div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>  part1, part2, part3, part4, part5, rowCol1, rowCol2);</div>
<div class="line"><a name="l03141"></a><span class="lineno"> 3141</span> }</div>
<div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>  </div>
<div class="line"><a name="l03143"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f"> 3143</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f">statevec_setWeightedQuregKernel</a>(<a class="code" href="structComplex.html">Complex</a> fac1, <a class="code" href="structQureg.html">Qureg</a> qureg1, <a class="code" href="structComplex.html">Complex</a> fac2, <a class="code" href="structQureg.html">Qureg</a> qureg2, <a class="code" href="structComplex.html">Complex</a> facOut, <a class="code" href="structQureg.html">Qureg</a> out) {</div>
<div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>  </div>
<div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>  </div>
<div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecRe1 = qureg1.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecIm1 = qureg1.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecRe2 = qureg2.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecIm2 = qureg2.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReOut = out.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImOut = out.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>  </div>
<div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facRe1 = fac1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>; </div>
<div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facIm1 = fac1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facRe2 = fac2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facIm2 = fac2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facReOut = facOut.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> facImOut = facOut.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>  </div>
<div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re1,im1, re2,im2, reOut,imOut;</div>
<div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = ampInd;</div>
<div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>  </div>
<div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>  re1 = vecRe1[index]; im1 = vecIm1[index];</div>
<div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>  re2 = vecRe2[index]; im2 = vecIm2[index];</div>
<div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>  reOut = vecReOut[index];</div>
<div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>  imOut = vecImOut[index];</div>
<div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>  </div>
<div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>  vecReOut[index] = (facReOut*reOut - facImOut*imOut) + (facRe1*re1 - facIm1*im1) + (facRe2*re2 - facIm2*im2);</div>
<div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>  vecImOut[index] = (facReOut*imOut + facImOut*reOut) + (facRe1*im1 + facIm1*re1) + (facRe2*im2 + facIm2*re2);</div>
<div class="line"><a name="l03173"></a><span class="lineno"> 3173</span> }</div>
<div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>  </div>
<div class="line"><a name="l03175"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663"> 3175</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663">statevec_setWeightedQureg</a>(<a class="code" href="structComplex.html">Complex</a> fac1, <a class="code" href="structQureg.html">Qureg</a> qureg1, <a class="code" href="structComplex.html">Complex</a> fac2, <a class="code" href="structQureg.html">Qureg</a> qureg2, <a class="code" href="structComplex.html">Complex</a> facOut, <a class="code" href="structQureg.html">Qureg</a> out) {</div>
<div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>  </div>
<div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmpsToVisit = qureg1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>  </div>
<div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>  statevec_setWeightedQuregKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>  fac1, qureg1, fac2, qureg2, facOut, out</div>
<div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>  );</div>
<div class="line"><a name="l03185"></a><span class="lineno"> 3185</span> }</div>
<div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>  </div>
<div class="line"><a name="l03187"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0ac752f618123ed417cf0e6358c07fde"> 3187</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a0ac752f618123ed417cf0e6358c07fde">statevec_applyDiagonalOpKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>  </div>
<div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>  <span class="comment">// each thread modifies one value; a wasteful and inefficient strategy</span></div>
<div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>  <span class="keywordflow">if</span> (thisTask >= numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>  </div>
<div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opRe = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real;</div>
<div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opIm = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag;</div>
<div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>  </div>
<div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> a = stateRe[thisTask];</div>
<div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> b = stateIm[thisTask];</div>
<div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = opRe[thisTask];</div>
<div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> d = opIm[thisTask];</div>
<div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>  </div>
<div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>  <span class="comment">// (a + b i)(c + d i) = (a c - b d) + i (a d + b c)</span></div>
<div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>  stateRe[thisTask] = a*c - b*d;</div>
<div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>  stateIm[thisTask] = a*d + b*c;</div>
<div class="line"><a name="l03207"></a><span class="lineno"> 3207</span> }</div>
<div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>  </div>
<div class="line"><a name="l03209"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a27294e3065ebe42a65b3b9e0f85551dd"> 3209</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a27294e3065ebe42a65b3b9e0f85551dd">statevec_applyDiagonalOp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) </div>
<div class="line"><a name="l03210"></a><span class="lineno"> 3210</span> {</div>
<div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>  statevec_applyDiagonalOpKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, op);</div>
<div class="line"><a name="l03215"></a><span class="lineno"> 3215</span> }</div>
<div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>  </div>
<div class="line"><a name="l03217"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ac26cd978b61d5c9a23be9f0aceb96ced"> 3217</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ac26cd978b61d5c9a23be9f0aceb96ced">densmatr_applyDiagonalOpKernel</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>  </div>
<div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>  <span class="comment">// each thread modifies one value; a wasteful and inefficient strategy</span></div>
<div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>  <span class="keywordflow">if</span> (thisTask >= numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>  </div>
<div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real;</div>
<div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag;</div>
<div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opRe = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real;</div>
<div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opIm = op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag;</div>
<div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>  </div>
<div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>  <span class="keywordtype">int</span> opDim = (1 << op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>);</div>
<div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> a = stateRe[thisTask];</div>
<div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> b = stateIm[thisTask];</div>
<div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = opRe[thisTask % opDim];</div>
<div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> d = opIm[thisTask % opDim];</div>
<div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>  </div>
<div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>  <span class="comment">// (a + b i)(c + d i) = (a c - b d) + i (a d + b c)</span></div>
<div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>  stateRe[thisTask] = a*c - b*d;</div>
<div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>  stateIm[thisTask] = a*d + b*c;</div>
<div class="line"><a name="l03238"></a><span class="lineno"> 3238</span> }</div>
<div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>  </div>
<div class="line"><a name="l03240"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aedd7ecccf2f09dd2f1c5d191950b51e6"> 3240</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aedd7ecccf2f09dd2f1c5d191950b51e6">densmatr_applyDiagonalOp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>  </div>
<div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>  CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)(qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/threadsPerCUDABlock);</div>
<div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>  densmatr_applyDiagonalOpKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, op);</div>
<div class="line"><a name="l03246"></a><span class="lineno"> 3246</span> }</div>
<div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>  </div>
<div class="line"><a name="l03249"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a34c5af075a18c7d6513a3d41284f1ab3"> 3249</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a34c5af075a18c7d6513a3d41284f1ab3">statevec_calcExpecDiagonalOpKernel</a>(</div>
<div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>  <span class="keywordtype">int</span> getRealComp,</div>
<div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecImag, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opImag, </div>
<div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTermsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray) </div>
<div class="line"><a name="l03253"></a><span class="lineno"> 3253</span> {</div>
<div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>  </div>
<div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> vecAbs = vecReal[index]*vecReal[index] + vecImag[index]*vecImag[index];</div>
<div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>  </div>
<div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>  <span class="comment">// choose whether to calculate the real or imaginary term of the expec term</span></div>
<div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecVal;</div>
<div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>  expecVal = vecAbs * opReal[index];</div>
<div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>  expecVal = vecAbs * opImag[index];</div>
<div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>  </div>
<div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>  tempReductionArray[threadIdx.x] = expecVal;</div>
<div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>  __syncthreads();</div>
<div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>  </div>
<div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l03274"></a><span class="lineno"> 3274</span> }</div>
<div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>  </div>
<div class="line"><a name="l03276"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0fb948ddab4ca210e523aa3c52639df4"> 3276</a></span> <a class="code" href="structComplex.html">Complex</a> <a class="code" href="QuEST__gpu_8cu.html#a0fb948ddab4ca210e523aa3c52639df4">statevec_calcExpecDiagonalOp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>  </div>
<div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>  <span class="comment">/* @TODO: remove all this reduction boilerplate from QuEST GPU </span></div>
<div class="line"><a name="l03279"></a><span class="lineno"> 3279</span> <span class="comment"> * (e.g. a func which accepts a pointer to do every-value reduction?)</span></div>
<div class="line"><a name="l03280"></a><span class="lineno"> 3280</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>  </div>
<div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecReal, expecImag;</div>
<div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>  </div>
<div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>  </div>
<div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>  getRealComp = 1;</div>
<div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>  firstTime = 1;</div>
<div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>  }</div>
<div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>  }</div>
<div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>  statevec_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>  getRealComp,</div>
<div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>  numValuesToReduce, </div>
<div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>  firstTime = 0;</div>
<div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>  }</div>
<div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>  }</div>
<div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>  cudaMemcpy(&expecReal, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>  </div>
<div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>  getRealComp = 0;</div>
<div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>  firstTime = 1;</div>
<div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>  }</div>
<div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>  }</div>
<div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>  statevec_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>  getRealComp,</div>
<div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>  numValuesToReduce, </div>
<div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>  firstTime = 0;</div>
<div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>  }</div>
<div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>  }</div>
<div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>  cudaMemcpy(&expecImag, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>  </div>
<div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>  <a class="code" href="structComplex.html">Complex</a> expecVal;</div>
<div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>  expecVal.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = expecReal;</div>
<div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>  expecVal.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = expecImag;</div>
<div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>  <span class="keywordflow">return</span> expecVal;</div>
<div class="line"><a name="l03365"></a><span class="lineno"> 3365</span> }</div>
<div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>  </div>
<div class="line"><a name="l03367"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#aecc4bcc79c74153d924edfd2edb930cf"> 3367</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#aecc4bcc79c74153d924edfd2edb930cf">densmatr_calcExpecDiagonalOpKernel</a>(</div>
<div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>  <span class="keywordtype">int</span> getRealComp,</div>
<div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* matReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* matImag, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opReal, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opImag, </div>
<div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>  <span class="keywordtype">int</span> numQubits, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTermsToSum, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reducedArray) </div>
<div class="line"><a name="l03371"></a><span class="lineno"> 3371</span> {</div>
<div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>  <span class="comment">// index will identy one of the 2^Q diagonals to be summed</span></div>
<div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> matInd = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>  <span class="keywordflow">if</span> (matInd >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>  </div>
<div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagSpacing = (1LL << numQubits) + 1LL;</div>
<div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>  <span class="keywordtype">int</span> isDiag = ((matInd % diagSpacing) == 0);</div>
<div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>  </div>
<div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> opInd = matInd / diagSpacing;</div>
<div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>  </div>
<div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> val = 0;</div>
<div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>  <span class="keywordflow">if</span> (isDiag) {</div>
<div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>  </div>
<div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> matRe = matReal[matInd];</div>
<div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> matIm = matImag[matInd];</div>
<div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> opRe = opReal[opInd];</div>
<div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> opIm = opImag[opInd];</div>
<div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>  </div>
<div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>  <span class="comment">// (matRe + matIm i)(opRe + opIm i) = </span></div>
<div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>  <span class="comment">// (matRe opRe - matIm opIm) + i (matRe opIm + matIm opRe)</span></div>
<div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>  val = matRe * opRe - matIm * opIm;</div>
<div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>  <span class="keywordflow">else</span> </div>
<div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>  val = matRe * opIm + matIm * opRe;</div>
<div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>  }</div>
<div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>  </div>
<div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>  tempReductionArray[threadIdx.x] = val;</div>
<div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>  __syncthreads();</div>
<div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>  </div>
<div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l03410"></a><span class="lineno"> 3410</span> }</div>
<div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>  </div>
<div class="line"><a name="l03412"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a70e3b0a2297c186d5c779af31459b4ca"> 3412</a></span> <a class="code" href="structComplex.html">Complex</a> <a class="code" href="QuEST__gpu_8cu.html#a70e3b0a2297c186d5c779af31459b4ca">densmatr_calcExpecDiagonalOp</a>(<a class="code" href="structQureg.html">Qureg</a> qureg, <a class="code" href="structDiagonalOp.html">DiagonalOp</a> op) {</div>
<div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>  </div>
<div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>  <span class="comment">/* @TODO: remove all this reduction boilerplate from QuEST GPU </span></div>
<div class="line"><a name="l03415"></a><span class="lineno"> 3415</span> <span class="comment"> * (e.g. a func which accepts a pointer to do every-value reduction?)</span></div>
<div class="line"><a name="l03416"></a><span class="lineno"> 3416</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>  </div>
<div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecReal, expecImag;</div>
<div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>  </div>
<div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>  </div>
<div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>  getRealComp = 1;</div>
<div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>  firstTime = 1;</div>
<div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>  }</div>
<div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>  }</div>
<div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  densmatr_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>  getRealComp,</div>
<div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>  op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>, numValuesToReduce, </div>
<div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>  firstTime = 0;</div>
<div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>  }</div>
<div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>  }</div>
<div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>  cudaMemcpy(&expecReal, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>  </div>
<div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>  getRealComp = 0;</div>
<div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>  numValuesToReduce = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>  firstTime = 1;</div>
<div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>  }</div>
<div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>  }</div>
<div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>  densmatr_calcExpecDiagonalOpKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>  getRealComp,</div>
<div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, </div>
<div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real, op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag, </div>
<div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>  op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>, numValuesToReduce, </div>
<div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>  firstTime = 0;</div>
<div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>  <a class="code" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a>(&(qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>), &(qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>));</div>
<div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>  }</div>
<div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>  }</div>
<div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>  cudaMemcpy(&expecImag, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>  </div>
<div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>  <a class="code" href="structComplex.html">Complex</a> expecVal;</div>
<div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  expecVal.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = expecReal;</div>
<div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>  expecVal.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = expecImag;</div>
<div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>  <span class="keywordflow">return</span> expecVal;</div>
<div class="line"><a name="l03501"></a><span class="lineno"> 3501</span> }</div>
<div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>  </div>
<div class="line"><a name="l03503"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab58d6d599c7a729255b1f8eeded663f3"> 3503</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab58d6d599c7a729255b1f8eeded663f3">agnostic_setDiagonalOpElems</a>(<a class="code" href="structDiagonalOp.html">DiagonalOp</a> op, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> startInd, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* real, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* imag, <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numElems) {</div>
<div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>  </div>
<div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>  <span class="comment">// update both RAM and VRAM, for consistency</span></div>
<div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>  memcpy(&op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>[startInd], real, numElems * <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>  memcpy(&op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>[startInd], imag, numElems * <span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>));</div>
<div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>  </div>
<div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>  cudaDeviceSynchronize();</div>
<div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>  cudaMemcpy(</div>
<div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real + startInd, </div>
<div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>  real,</div>
<div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>  numElems * <span class="keyword">sizeof</span>(*(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.real)), </div>
<div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  cudaMemcpy(</div>
<div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag + startInd,</div>
<div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>  imag,</div>
<div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  numElems * <span class="keyword">sizeof</span>(*(op.<a class="code" href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">deviceOperator</a>.imag)), </div>
<div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>  cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03520"></a><span class="lineno"> 3520</span> }</div>
<div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>  </div>
<div class="line"><a name="l03522"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#af6f0087743a115ed303cd4733b9f9494"> 3522</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#af6f0087743a115ed303cd4733b9f9494">statevec_applyPhaseFuncOverridesKernel</a>(</div>
<div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span> numQubits, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding,</div>
<div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* coeffs, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* exponents, <span class="keywordtype">int</span> numTerms, </div>
<div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* overrideInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* overridePhases, <span class="keywordtype">int</span> numOverrides, </div>
<div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>  <span class="keywordtype">int</span> conj</div>
<div class="line"><a name="l03527"></a><span class="lineno"> 3527</span> ) {</div>
<div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>  <span class="keywordflow">if</span> (index>=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>  </div>
<div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>  <span class="comment">// determine global amplitude index (non-distributed, so it's just local index)</span></div>
<div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalAmpInd = index;</div>
<div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>  </div>
<div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>  <span class="comment">// determine phase index of {qubits}</span></div>
<div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> phaseInd = 0LL;</div>
<div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>  <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a>) {</div>
<div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits; q++)</div>
<div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>  phaseInd += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], globalAmpInd);</div>
<div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>  }</div>
<div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a>) {</div>
<div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubits-1; q++) <span class="comment">// use final qubit to indicate sign </span></div>
<div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>  phaseInd += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], globalAmpInd);</div>
<div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[numQubits-1], globalAmpInd) == 1)</div>
<div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>  phaseInd -= (1LL << (numQubits-1));</div>
<div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>  }</div>
<div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>  </div>
<div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>  <span class="comment">// determine if this phase index has an overriden value (i < numOverrides)</span></div>
<div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>  <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>  <span class="keywordflow">for</span> (i=0; i<numOverrides; i++)</div>
<div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>  <span class="keywordflow">if</span> (phaseInd == overrideInds[i])</div>
<div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>  </div>
<div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>  <span class="comment">// determine phase from {coeffs}, {exponents} (unless overriden)</span></div>
<div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> phase = 0;</div>
<div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>  <span class="keywordflow">if</span> (i < numOverrides)</div>
<div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>  phase = overridePhases[i];</div>
<div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t<numTerms; t++)</div>
<div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>  phase += coeffs[t] * pow(phaseInd, exponents[t]);</div>
<div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>  </div>
<div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>  <span class="comment">// negate phase to conjugate operator </span></div>
<div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>  <span class="keywordflow">if</span> (conj)</div>
<div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>  phase *= -1;</div>
<div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>  </div>
<div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>  <span class="comment">// modify amp to amp * exp(i phase) </span></div>
<div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = cos(phase);</div>
<div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> s = sin(phase);</div>
<div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index];</div>
<div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index];</div>
<div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>  </div>
<div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>  <span class="comment">// = {re[amp] cos(phase) - im[amp] sin(phase)} + i {re[amp] sin(phase) + im[amp] cos(phase)}</span></div>
<div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] = re*c - im*s;</div>
<div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index] = re*s + im*c;</div>
<div class="line"><a name="l03574"></a><span class="lineno"> 3574</span> }</div>
<div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>  </div>
<div class="line"><a name="l03576"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a9d7928473aca695a614e9c24d903e578"> 3576</a></span>  <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a9d7928473aca695a614e9c24d903e578">statevec_applyPhaseFuncOverrides</a>(</div>
<div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span> numQubits, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding,</div>
<div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* coeffs, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* exponents, <span class="keywordtype">int</span> numTerms, </div>
<div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* overrideInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* overridePhases, <span class="keywordtype">int</span> numOverrides,</div>
<div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>  <span class="keywordtype">int</span> conj</div>
<div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  ) {</div>
<div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>  <span class="comment">// allocate device space for global list of {qubits}, {coeffs}, {exponents}, {overrideInds} and {overridePhases}</span></div>
<div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  <span class="keywordtype">int</span>* d_qubits; <span class="keywordtype">size_t</span> mem_qubits = numQubits * <span class="keyword">sizeof</span> *d_qubits;</div>
<div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_coeffs; <span class="keywordtype">size_t</span> mem_terms = numTerms * <span class="keyword">sizeof</span> *d_coeffs;</div>
<div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_exponents; </div>
<div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* d_overrideInds; <span class="keywordtype">size_t</span> mem_inds = numOverrides * <span class="keyword">sizeof</span> *d_overrideInds;</div>
<div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_overridePhases; <span class="keywordtype">size_t</span> mem_phas = numOverrides * <span class="keyword">sizeof</span> *d_overridePhases;</div>
<div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>  cudaMalloc(&d_qubits, mem_qubits); cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>  cudaMalloc(&d_coeffs, mem_terms); cudaMemcpy(d_coeffs, coeffs, mem_terms, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>  cudaMalloc(&d_exponents, mem_terms); cudaMemcpy(d_exponents, exponents, mem_terms, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>  cudaMalloc(&d_overrideInds, mem_inds); cudaMemcpy(d_overrideInds, overrideInds, mem_inds, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>  cudaMalloc(&d_overridePhases,mem_phas); cudaMemcpy(d_overridePhases, overridePhases, mem_phas, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>  </div>
<div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / threadsPerCUDABlock);</div>
<div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>  statevec_applyPhaseFuncOverridesKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>  qureg, d_qubits, numQubits, encoding, </div>
<div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>  d_coeffs, d_exponents, numTerms, </div>
<div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>  d_overrideInds, d_overridePhases, numOverrides,</div>
<div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>  conj);</div>
<div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  </div>
<div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>  <span class="comment">// cleanup device memory </span></div>
<div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  cudaFree(d_coeffs);</div>
<div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  cudaFree(d_exponents);</div>
<div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  cudaFree(d_overrideInds);</div>
<div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>  cudaFree(d_overridePhases);</div>
<div class="line"><a name="l03609"></a><span class="lineno"> 3609</span> }</div>
<div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>  </div>
<div class="line"><a name="l03611"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a5224b64ff81ca7b205c26f01bb704241"> 3611</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a5224b64ff81ca7b205c26f01bb704241">statevec_applyMultiVarPhaseFuncOverridesKernel</a>(</div>
<div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span>* numQubitsPerReg, <span class="keywordtype">int</span> numRegs, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding,</div>
<div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* coeffs, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* exponents, <span class="keywordtype">int</span>* numTermsPerReg, </div>
<div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* overrideInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* overridePhases, <span class="keywordtype">int</span> numOverrides,</div>
<div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *phaseInds,</div>
<div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>  <span class="keywordtype">int</span> conj</div>
<div class="line"><a name="l03617"></a><span class="lineno"> 3617</span> ) {</div>
<div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>  <span class="keywordflow">if</span> (index>=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>  </div>
<div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>  <span class="comment">// determine global amplitude index (non-distributed, so it's just local index)</span></div>
<div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalAmpInd = index;</div>
<div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>  </div>
<div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l03625"></a><span class="lineno"> 3625</span> <span class="comment"> * each thread needs to write to a local:</span></div>
<div class="line"><a name="l03626"></a><span class="lineno"> 3626</span> <span class="comment"> * long long int phaseInds[numRegs];</span></div>
<div class="line"><a name="l03627"></a><span class="lineno"> 3627</span> <span class="comment"> * but instead has access to shared array phaseInds, with below stride and offset</span></div>
<div class="line"><a name="l03628"></a><span class="lineno"> 3628</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>  </div>
<div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>  <span class="comment">// determine phase indices</span></div>
<div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  <span class="keywordtype">int</span> flatInd = 0;</div>
<div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a>) {</div>
<div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]; q++)</div>
<div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>  }</div>
<div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  }</div>
<div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a>) {</div>
<div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]-1; q++) </div>
<div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>  <span class="comment">// use final qubit to indicate sign</span></div>
<div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd) == 1)</div>
<div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>  phaseInds[r*stride+offset] -= (1LL << (numQubitsPerReg[r]-1)); </div>
<div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>  }</div>
<div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>  }</div>
<div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>  </div>
<div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>  <span class="comment">// determine if this phase index has an overriden value (i < numOverrides)</span></div>
<div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>  <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>  <span class="keywordflow">for</span> (i=0; i<numOverrides; i++) {</div>
<div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>  <span class="keywordtype">int</span> found = 1;</div>
<div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>  <span class="keywordflow">if</span> (phaseInds[r*stride+offset] != overrideInds[i*numRegs+r]) {</div>
<div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>  found = 0;</div>
<div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>  }</div>
<div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>  }</div>
<div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>  <span class="keywordflow">if</span> (found)</div>
<div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>  }</div>
<div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>  </div>
<div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>  <span class="comment">// compute the phase (unless overriden)</span></div>
<div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> phase = 0;</div>
<div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>  <span class="keywordflow">if</span> (i < numOverrides)</div>
<div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>  phase = overridePhases[i];</div>
<div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>  flatInd = 0;</div>
<div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t<numTermsPerReg[r]; t++) {</div>
<div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>  phase += coeffs[flatInd] * pow(phaseInds[r*stride+offset], exponents[flatInd]);</div>
<div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>  flatInd++;</div>
<div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>  }</div>
<div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>  }</div>
<div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>  }</div>
<div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>  </div>
<div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>  <span class="comment">// negate phase to conjugate operator </span></div>
<div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>  <span class="keywordflow">if</span> (conj)</div>
<div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  phase *= -1;</div>
<div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>  </div>
<div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>  <span class="comment">// modify amp to amp * exp(i phase) </span></div>
<div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = cos(phase);</div>
<div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> s = sin(phase);</div>
<div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index];</div>
<div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index];</div>
<div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>  </div>
<div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>  <span class="comment">// = {re[amp] cos(phase) - im[amp] sin(phase)} + i {re[amp] sin(phase) + im[amp] cos(phase)}</span></div>
<div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] = re*c - im*s;</div>
<div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index] = re*s + im*c;</div>
<div class="line"><a name="l03693"></a><span class="lineno"> 3693</span> }</div>
<div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>  </div>
<div class="line"><a name="l03695"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ab33437d10c1ce1c4b034c7c411db553f"> 3695</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ab33437d10c1ce1c4b034c7c411db553f">statevec_applyMultiVarPhaseFuncOverrides</a>(</div>
<div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span>* numQubitsPerReg, <span class="keywordtype">int</span> numRegs, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding,</div>
<div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* coeffs, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* exponents, <span class="keywordtype">int</span>* numTermsPerReg, </div>
<div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* overrideInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* overridePhases, <span class="keywordtype">int</span> numOverrides,</div>
<div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>  <span class="keywordtype">int</span> conj</div>
<div class="line"><a name="l03700"></a><span class="lineno"> 3700</span> ) {</div>
<div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>  <span class="comment">// determine size of arrays, for cloning into GPU memory</span></div>
<div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>  <span class="keywordtype">size_t</span> mem_numQubitsPerReg = numRegs * <span class="keyword">sizeof</span> *numQubitsPerReg;</div>
<div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>  <span class="keywordtype">size_t</span> mem_numTermsPerReg = numRegs * <span class="keyword">sizeof</span> *numTermsPerReg;</div>
<div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>  <span class="keywordtype">size_t</span> mem_overridePhases = numOverrides * <span class="keyword">sizeof</span> *overridePhases;</div>
<div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>  <span class="keywordtype">size_t</span> mem_overrideInds = numOverrides * numRegs * <span class="keyword">sizeof</span> *overrideInds;</div>
<div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>  <span class="keywordtype">size_t</span> mem_qubits = 0;</div>
<div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>  <span class="keywordtype">size_t</span> mem_coeffs = 0; </div>
<div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>  <span class="keywordtype">size_t</span> mem_exponents = 0;</div>
<div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>  mem_qubits += numQubitsPerReg[r] * <span class="keyword">sizeof</span> *qubits;</div>
<div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>  mem_coeffs += numTermsPerReg[r] * <span class="keyword">sizeof</span> *coeffs;</div>
<div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>  mem_exponents += numTermsPerReg[r] * <span class="keyword">sizeof</span> *exponents;</div>
<div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>  }</div>
<div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>  </div>
<div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>  <span class="comment">// allocate global GPU memory</span></div>
<div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>  <span class="keywordtype">int</span>* d_qubits; cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_coeffs; cudaMalloc(&d_coeffs, mem_coeffs);</div>
<div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_exponents; cudaMalloc(&d_exponents, mem_exponents);</div>
<div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>  <span class="keywordtype">int</span>* d_numQubitsPerReg; cudaMalloc(&d_numQubitsPerReg, mem_numQubitsPerReg);</div>
<div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>  <span class="keywordtype">int</span>* d_numTermsPerReg; cudaMalloc(&d_numTermsPerReg, mem_numTermsPerReg);</div>
<div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* d_overrideInds; cudaMalloc(&d_overrideInds, mem_overrideInds);</div>
<div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_overridePhases; cudaMalloc(&d_overridePhases, mem_overridePhases);</div>
<div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>  </div>
<div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>  <span class="comment">// copy function args into GPU memory</span></div>
<div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>  cudaMemcpy(d_coeffs, coeffs, mem_coeffs, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>  cudaMemcpy(d_exponents, exponents, mem_exponents, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>  cudaMemcpy(d_numQubitsPerReg, numQubitsPerReg, mem_numQubitsPerReg, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>  cudaMemcpy(d_numTermsPerReg, numTermsPerReg, mem_numTermsPerReg, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>  cudaMemcpy(d_overrideInds, overrideInds, mem_overrideInds, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>  cudaMemcpy(d_overridePhases, overridePhases, mem_overridePhases, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>  </div>
<div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / threadsPerCUDABlock);</div>
<div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>  </div>
<div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>  <span class="comment">// allocate thread-local working space {phaseInds}</span></div>
<div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_phaseInds;</div>
<div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>  cudaMalloc(&d_phaseInds, numRegs*gridSize * <span class="keyword">sizeof</span> *d_phaseInds);</div>
<div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>  </div>
<div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>  statevec_applyMultiVarPhaseFuncOverridesKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>  qureg, d_qubits, d_numQubitsPerReg, numRegs, encoding,</div>
<div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>  d_coeffs, d_exponents, d_numTermsPerReg, </div>
<div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>  d_overrideInds, d_overridePhases, numOverrides,</div>
<div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>  d_phaseInds, </div>
<div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>  conj);</div>
<div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>  </div>
<div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>  <span class="comment">// free device memory</span></div>
<div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>  cudaFree(d_coeffs);</div>
<div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>  cudaFree(d_exponents);</div>
<div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>  cudaFree(d_numQubitsPerReg);</div>
<div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>  cudaFree(d_numTermsPerReg);</div>
<div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>  cudaFree(d_overrideInds);</div>
<div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>  cudaFree(d_overridePhases);</div>
<div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>  cudaFree(d_phaseInds);</div>
<div class="line"><a name="l03758"></a><span class="lineno"> 3758</span> }</div>
<div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>  </div>
<div class="line"><a name="l03760"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#a0ab7d9b8126b7074f21ba3e2316dd246"> 3760</a></span> __global__ <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#a0ab7d9b8126b7074f21ba3e2316dd246">statevec_applyParamNamedPhaseFuncOverridesKernel</a>(</div>
<div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span>* numQubitsPerReg, <span class="keywordtype">int</span> numRegs, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding,</div>
<div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>  <span class="keyword">enum</span> <a class="code" href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a> phaseFuncName, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* params, <span class="keywordtype">int</span> numParams,</div>
<div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* overrideInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* overridePhases, <span class="keywordtype">int</span> numOverrides,</div>
<div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* phaseInds,</div>
<div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>  <span class="keywordtype">int</span> conj</div>
<div class="line"><a name="l03766"></a><span class="lineno"> 3766</span> ) {</div>
<div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>  <span class="keywordflow">if</span> (index>=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>  </div>
<div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>  <span class="comment">// determine global amplitude index (non-distributed, so it's just local index)</span></div>
<div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalAmpInd = index;</div>
<div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>  </div>
<div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l03774"></a><span class="lineno"> 3774</span> <span class="comment"> * each thread needs to write to a local:</span></div>
<div class="line"><a name="l03775"></a><span class="lineno"> 3775</span> <span class="comment"> * long long int phaseInds[numRegs];</span></div>
<div class="line"><a name="l03776"></a><span class="lineno"> 3776</span> <span class="comment"> * but instead has access to shared array phaseInds, with below stride and offset</span></div>
<div class="line"><a name="l03777"></a><span class="lineno"> 3777</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>  </div>
<div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>  <span class="comment">// determine phase indices</span></div>
<div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>  <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a>) {</div>
<div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>  <span class="keywordtype">int</span> flatInd = 0;</div>
<div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]; q++)</div>
<div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>  }</div>
<div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>  }</div>
<div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (encoding == <a class="code" href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a>) {</div>
<div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>  <span class="keywordtype">int</span> flatInd = 0;</div>
<div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>  phaseInds[r*stride+offset] = 0LL;</div>
<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> q=0; q<numQubitsPerReg[r]-1; q++) </div>
<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>  phaseInds[r*stride+offset] += (1LL << q) * <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd);</div>
<div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>  <span class="comment">// use final qubit to indicate sign</span></div>
<div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[flatInd++], globalAmpInd) == 1)</div>
<div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>  phaseInds[r*stride+offset] -= (1LL << (numQubitsPerReg[r]-1));</div>
<div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>  }</div>
<div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>  }</div>
<div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>  </div>
<div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>  <span class="comment">// determine if this phase index has an overriden value (i < numOverrides)</span></div>
<div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>  <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>  <span class="keywordflow">for</span> (i=0; i<numOverrides; i++) {</div>
<div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>  <span class="keywordtype">int</span> found = 1;</div>
<div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>  <span class="keywordflow">if</span> (phaseInds[r*stride+offset] != overrideInds[i*numRegs+r]) {</div>
<div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>  found = 0;</div>
<div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>  }</div>
<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>  }</div>
<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>  <span class="keywordflow">if</span> (found)</div>
<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>  <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>  }</div>
<div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>  </div>
<div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>  <span class="comment">// compute the phase (unless overriden)</span></div>
<div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> phase = 0;</div>
<div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>  <span class="keywordflow">if</span> (i < numOverrides)</div>
<div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>  phase = overridePhases[i];</div>
<div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>  <span class="comment">// compute norm related phases</span></div>
<div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e">NORM</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043">INVERSE_NORM</a> ||</div>
<div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1">SCALED_NORM</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2">SCALED_INVERSE_NORM</a> ||</div>
<div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a>) {</div>
<div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> norm = 0;</div>
<div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a>) {</div>
<div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++) {</div>
<div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dif = phaseInds[r*stride+offset] - params[2+r];</div>
<div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>  norm += dif*dif;</div>
<div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>  }</div>
<div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>  }</div>
<div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++)</div>
<div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>  norm += phaseInds[r*stride+offset]*phaseInds[r*stride+offset];</div>
<div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>  norm = sqrt(norm);</div>
<div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>  </div>
<div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e">NORM</a>)</div>
<div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>  phase = norm;</div>
<div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043">INVERSE_NORM</a>)</div>
<div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>  phase = (norm == 0.)? params[0] : 1/norm; <span class="comment">// smallest non-zero norm is 1</span></div>
<div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1">SCALED_NORM</a>)</div>
<div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>  phase = params[0] * norm;</div>
<div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2">SCALED_INVERSE_NORM</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a>)</div>
<div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>  phase = (norm <= REAL_EPS)? params[1] : params[0] / norm; <span class="comment">// unless shifted closer to zero</span></div>
<div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>  }</div>
<div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>  <span class="comment">// compute product related phases</span></div>
<div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4">PRODUCT</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556">INVERSE_PRODUCT</a> ||</div>
<div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93">SCALED_PRODUCT</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb">SCALED_INVERSE_PRODUCT</a>) {</div>
<div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>  </div>
<div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prod = 1;</div>
<div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++)</div>
<div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>  prod *= phaseInds[r*stride+offset];</div>
<div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>  </div>
<div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4">PRODUCT</a>)</div>
<div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>  phase = prod;</div>
<div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556">INVERSE_PRODUCT</a>)</div>
<div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>  phase = (prod == 0.)? params[0] : 1/prod; <span class="comment">// smallest non-zero prod is +- 1</span></div>
<div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93">SCALED_PRODUCT</a>)</div>
<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>  phase = params[0] * prod;</div>
<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb">SCALED_INVERSE_PRODUCT</a>)</div>
<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>  phase = (prod == 0.)? params[1] : params[0] / prod;</div>
<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>  }</div>
<div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>  <span class="comment">// compute Euclidean distance related phases </span></div>
<div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91">DISTANCE</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0">INVERSE_DISTANCE</a> ||</div>
<div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4">SCALED_DISTANCE</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227">SCALED_INVERSE_DISTANCE</a> ||</div>
<div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>  phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a>) {</div>
<div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>  </div>
<div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dist = 0;</div>
<div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a>) {</div>
<div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r+=2) {</div>
<div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dif = (phaseInds[r*stride+offset] - phaseInds[(r+1)*stride+offset] - params[2+r/2]);</div>
<div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>  dist += dif*dif;</div>
<div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>  }</div>
<div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>  }</div>
<div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r+=2) {</div>
<div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dif = (phaseInds[(r+1)*stride+offset] - phaseInds[r*stride+offset]);</div>
<div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>  dist += dif*dif;</div>
<div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>  }</div>
<div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>  dist = sqrt(dist);</div>
<div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>  </div>
<div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>  <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91">DISTANCE</a>)</div>
<div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>  phase = dist;</div>
<div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0">INVERSE_DISTANCE</a>)</div>
<div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>  phase = (dist == 0.)? params[0] : 1/dist; <span class="comment">// smallest non-zero dist is 1</span></div>
<div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4">SCALED_DISTANCE</a>)</div>
<div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>  phase = params[0] * dist;</div>
<div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227">SCALED_INVERSE_DISTANCE</a> || phaseFuncName == <a class="code" href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a>)</div>
<div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>  phase = (dist <= REAL_EPS)? params[1] : params[0] / dist; <span class="comment">// unless shifted closer</span></div>
<div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>  }</div>
<div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>  }</div>
<div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>  </div>
<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>  </div>
<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>  <span class="comment">// negate phase to conjugate operator </span></div>
<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>  <span class="keywordflow">if</span> (conj)</div>
<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>  phase *= -1;</div>
<div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>  </div>
<div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>  <span class="comment">// modify amp to amp * exp(i phase) </span></div>
<div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> c = cos(phase);</div>
<div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> s = sin(phase);</div>
<div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index];</div>
<div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im = qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index];</div>
<div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>  </div>
<div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>  <span class="comment">// = {re[amp] cos(phase) - im[amp] sin(phase)} + i {re[amp] sin(phase) + im[amp] cos(phase)}</span></div>
<div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index] = re*c - im*s;</div>
<div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index] = re*s + im*c;</div>
<div class="line"><a name="l03907"></a><span class="lineno"> 3907</span> }</div>
<div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>  </div>
<div class="line"><a name="l03909"></a><span class="lineno"><a class="line" href="QuEST__gpu_8cu.html#ad5b7e25e42427dfa7f19fd950264bb16"> 3909</a></span> <span class="keywordtype">void</span> <a class="code" href="QuEST__gpu_8cu.html#ad5b7e25e42427dfa7f19fd950264bb16">statevec_applyParamNamedPhaseFuncOverrides</a>(</div>
<div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>  <a class="code" href="structQureg.html">Qureg</a> qureg, <span class="keywordtype">int</span>* qubits, <span class="keywordtype">int</span>* numQubitsPerReg, <span class="keywordtype">int</span> numRegs, <span class="keyword">enum</span> <a class="code" href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a> encoding,</div>
<div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>  <span class="keyword">enum</span> <a class="code" href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a> phaseFuncName, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* params, <span class="keywordtype">int</span> numParams,</div>
<div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* overrideInds, <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* overridePhases, <span class="keywordtype">int</span> numOverrides,</div>
<div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>  <span class="keywordtype">int</span> conj </div>
<div class="line"><a name="l03914"></a><span class="lineno"> 3914</span> ) {</div>
<div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>  <span class="comment">// determine size of arrays, for cloning into GPU memory</span></div>
<div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>  <span class="keywordtype">size_t</span> mem_numQubitsPerReg = numRegs * <span class="keyword">sizeof</span> *numQubitsPerReg;</div>
<div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>  <span class="keywordtype">size_t</span> mem_overridePhases = numOverrides * <span class="keyword">sizeof</span> *overridePhases;</div>
<div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>  <span class="keywordtype">size_t</span> mem_overrideInds = numOverrides * numRegs * <span class="keyword">sizeof</span> *overrideInds;</div>
<div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>  <span class="keywordtype">size_t</span> mem_params = numParams * <span class="keyword">sizeof</span> *params;</div>
<div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>  <span class="keywordtype">size_t</span> mem_qubits = 0;</div>
<div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r<numRegs; r++)</div>
<div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>  mem_qubits += numQubitsPerReg[r] * <span class="keyword">sizeof</span> *qubits;</div>
<div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>  </div>
<div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>  <span class="comment">// allocate global GPU memory</span></div>
<div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>  <span class="keywordtype">int</span>* d_qubits; cudaMalloc(&d_qubits, mem_qubits);</div>
<div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>  <span class="keywordtype">int</span>* d_numQubitsPerReg; cudaMalloc(&d_numQubitsPerReg, mem_numQubitsPerReg);</div>
<div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* d_overrideInds; cudaMalloc(&d_overrideInds, mem_overrideInds);</div>
<div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_overridePhases; cudaMalloc(&d_overridePhases, mem_overridePhases);</div>
<div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_params = NULL; <span class="keywordflow">if</span> (numParams > 0) cudaMalloc(&d_params, mem_params);</div>
<div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>  </div>
<div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>  <span class="comment">// copy function args into GPU memory</span></div>
<div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>  cudaMemcpy(d_qubits, qubits, mem_qubits, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>  cudaMemcpy(d_numQubitsPerReg, numQubitsPerReg, mem_numQubitsPerReg, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>  cudaMemcpy(d_overrideInds, overrideInds, mem_overrideInds, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>  cudaMemcpy(d_overridePhases, overridePhases, mem_overridePhases, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>  <span class="keywordflow">if</span> (numParams > 0)</div>
<div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>  cudaMemcpy(d_params, params, mem_params, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>  </div>
<div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>  <span class="keywordtype">int</span> CUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> / threadsPerCUDABlock);</div>
<div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>  </div>
<div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>  <span class="comment">// allocate thread-local working space {phaseInds}</span></div>
<div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_phaseInds;</div>
<div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>  cudaMalloc(&d_phaseInds, numRegs*gridSize * <span class="keyword">sizeof</span> *d_phaseInds);</div>
<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>  </div>
<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>  <span class="comment">// call kernel</span></div>
<div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>  statevec_applyParamNamedPhaseFuncOverridesKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>  qureg, d_qubits, d_numQubitsPerReg, numRegs, encoding,</div>
<div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>  phaseFuncName, d_params, numParams,</div>
<div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>  d_overrideInds, d_overridePhases, numOverrides,</div>
<div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>  d_phaseInds,</div>
<div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>  conj);</div>
<div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>  </div>
<div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>  <span class="comment">// free device memory</span></div>
<div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>  cudaFree(d_qubits);</div>
<div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>  cudaFree(d_numQubitsPerReg);</div>
<div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>  cudaFree(d_overrideInds);</div>
<div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>  cudaFree(d_overridePhases);</div>
<div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>  cudaFree(d_phaseInds);</div>
<div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>  <span class="keywordflow">if</span> (numParams > 0)</div>
<div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>  cudaFree(d_params);</div>
<div class="line"><a name="l03963"></a><span class="lineno"> 3963</span> }</div>
<div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>  </div>
<div class="line"><a name="l03965"></a><span class="lineno"><a class="line" href="group__debug.html#ga555451c697ea4a9d27389155f68fdabc"> 3965</a></span> <span class="keywordtype">void</span> <a class="code" href="group__debug.html#ga555451c697ea4a9d27389155f68fdabc">seedQuEST</a>(<a class="code" href="structQuESTEnv.html">QuESTEnv</a> *env, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *seedArray, <span class="keywordtype">int</span> numSeeds) {</div>
<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>  </div>
<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>  <span class="comment">// free existing seed array, if exists</span></div>
<div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>  <span class="keywordflow">if</span> (env-><a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a> != NULL)</div>
<div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>  free(env-><a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a>);</div>
<div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>  </div>
<div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>  <span class="comment">// record keys in permanent heap</span></div>
<div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>  env-><a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a> = malloc(numSeeds * <span class="keyword">sizeof</span> *(env-><a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a>));</div>
<div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<numSeeds; i++)</div>
<div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>  (env-><a class="code" href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">seeds</a>)[i] = seedArray[i];</div>
<div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>  env-><a class="code" href="structQuESTEnv.html#a46e67e1a5ab930e04ff59f83f1d8630d">numSeeds</a> = numSeeds;</div>
<div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>  </div>
<div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>  <span class="comment">// pass keys to Mersenne Twister seeder</span></div>
<div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>  <a class="code" href="mt19937ar_8c.html#ac1283f9b1ed571332f5ffe53545ffc16">init_by_array</a>(seedArray, numSeeds); </div>
<div class="line"><a name="l03979"></a><span class="lineno"> 3979</span> }</div>
<div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>  </div>
<div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>  </div>
<div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>  </div>
<div class="line"><a name="l03983"></a><span class="lineno"> 3983</span> <span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l03984"></a><span class="lineno"> 3984</span> }</div>
<div class="line"><a name="l03985"></a><span class="lineno"> 3985</span> <span class="preprocessor">#endif</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aQuEST__gpu_8cu_html_a81a87bb0f0805c9dfcb691f6cb15a1b5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a81a87bb0f0805c9dfcb691f6cb15a1b5">agnostic_initDiagonalOpFromPauliHamil</a></div><div class="ttdeci">void agnostic_initDiagonalOpFromPauliHamil(DiagonalOp op, PauliHamil hamil)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00418">QuEST_gpu.cu:418</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb26952815118f5ced7703302dbeb556">INVERSE_PRODUCT</a></div><div class="ttdeci">@ INVERSE_PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac501fe7b9d331be48359ce1546348f97"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac501fe7b9d331be48359ce1546348f97">densmatr_mixDamping</a></div><div class="ttdeci">void densmatr_mixDamping(Qureg qureg, int targetQubit, qreal damping)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03048">QuEST_gpu.cu:3048</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6d0bd05cfccc67102864429f1046ecc3"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6d0bd05cfccc67102864429f1046ecc3">statevec_multiControlledUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledUnitaryKernel(Qureg qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, int targetQubit, ArgMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01245">QuEST_gpu.cu:1245</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aaa36e3e86a5b79e676c6268fa2b02222"><div class="ttname"><a href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222">statevec_initPlusStateKernel</a></div><div class="ttdeci">__global__ void statevec_initPlusStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00631">QuEST_gpu.cu:631</a></div></div>
<div class="ttc" id="agroup__type_html_gaeff624226629d7063a8a776958a4f991"><div class="ttname"><a href="group__type.html#gaeff624226629d7063a8a776958a4f991">destroyQuESTEnv</a></div><div class="ttdeci">void destroyQuESTEnv(QuESTEnv env)</div><div class="ttdoc">Destroy the QuEST environment.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00489">QuEST_gpu.cu:489</a></div></div>
<div class="ttc" id="agroup__type_html_ga1c703cf89629e4e9c7023cd402d67028"><div class="ttname"><a href="group__type.html#ga1c703cf89629e4e9c7023cd402d67028">pauliOpType</a></div><div class="ttdeci">pauliOpType</div><div class="ttdoc">Codes for specifying Pauli operators.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00096">QuEST.h:96</a></div></div>
<div class="ttc" id="amt19937ar_8c_html_ac1283f9b1ed571332f5ffe53545ffc16"><div class="ttname"><a href="mt19937ar_8c.html#ac1283f9b1ed571332f5ffe53545ffc16">init_by_array</a></div><div class="ttdeci">void init_by_array(unsigned long init_key[], int key_length)</div><div class="ttdef"><b>Definition:</b> <a href="mt19937ar_8c_source.html#l00080">mt19937ar.c:80</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8ce1e311ea72b862a8757dc71082fbf3"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a></div><div class="ttdeci">__device__ __host__ unsigned int log2Int(unsigned int x)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01925">QuEST_gpu.cu:1925</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9bf24d5da6a5e78888c393a73fe45f0a"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9bf24d5da6a5e78888c393a73fe45f0a">agnostic_initDiagonalOpFromPauliHamilKernel</a></div><div class="ttdeci">__global__ void agnostic_initDiagonalOpFromPauliHamilKernel(DiagonalOp op, enum pauliOpType *pauliCodes, qreal *termCoeffs, int numSumTerms)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00389">QuEST_gpu.cu:389</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a040a1c670457b4b5789c089a3d32bf8f"><div class="ttname"><a href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f">statevec_setWeightedQuregKernel</a></div><div class="ttdeci">__global__ void statevec_setWeightedQuregKernel(Complex fac1, Qureg qureg1, Complex fac2, Qureg qureg2, Complex facOut, Qureg out)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03143">QuEST_gpu.cu:3143</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afc4dcedaf429d823f4da83d3521d8293"><div class="ttname"><a href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">densmatr_collapseToKnownProbOutcomeKernel</a></div><div class="ttdeci">__global__ void densmatr_collapseToKnownProbOutcomeKernel(qreal outcomeProb, qreal *vecReal, qreal *vecImag, long long int numBasesToVisit, long long int part1, long long int part2, long long int part3, long long int rowBit, long long int colBit, long long int desired, long long int undesired)</div><div class="ttdoc">Maps thread ID to a |..0..><..0..| state and then locates |0><1|, |1><0| and |1><1|.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02779">QuEST_gpu.cu:2779</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab7478fcaf6357ab202d72853b672e375"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a></div><div class="ttdeci">void statevec_swapQubitAmps(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01769">QuEST_gpu.cu:1769</a></div></div>
<div class="ttc" id="agroup__debug_html_ga924ef2dbda6b733b4041270077c76ece"><div class="ttname"><a href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a></div><div class="ttdeci">void copyStateFromGPU(Qureg qureg)</div><div class="ttdoc">In GPU mode, this copies the state-vector (or density matrix) from GPU memory (qureg....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00529">QuEST_gpu.cu:529</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae4ee10f6db39b2634c82159322181826"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae4ee10f6db39b2634c82159322181826">statevec_controlledUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_controlledUnitaryKernel(Qureg qureg, int controlQubit, int targetQubit, ArgMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01179">QuEST_gpu.cu:1179</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8d88b4ed94ab024e5e7b2f1f4f505b44"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a></div><div class="ttdeci">void statevec_multiRotateZ(Qureg qureg, long long int mask, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01588">QuEST_gpu.cu:1588</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html_aeadc9893e1b16cdd585dac523e73926c"><div class="ttname"><a href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">ComplexMatrix4::real</a></div><div class="ttdeci">qreal real[4][4]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00177">QuEST.h:177</a></div></div>
<div class="ttc" id="agroup__debug_html_ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><div class="ttname"><a href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a></div><div class="ttdeci">void syncQuESTEnv(QuESTEnv env)</div><div class="ttdoc">Guarantees that all code up to the given point has been executed on all nodes (if running in distribu...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00481">QuEST_gpu.cu:481</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a664339e2afc50b0418a56adfc1bc512e"><div class="ttname"><a href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e">densmatr_initPureStateKernel</a></div><div class="ttdeci">__global__ void densmatr_initPureStateKernel(long long int numPureAmps, qreal *targetVecReal, qreal *targetVecImag, qreal *copyVecReal, qreal *copyVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00186">QuEST_gpu.cu:186</a></div></div>
<div class="ttc" id="agroup__type_html_gga1c703cf89629e4e9c7023cd402d67028a085c85cff6ba79c52d8b1e61c42ddddf"><div class="ttname"><a href="group__type.html#gga1c703cf89629e4e9c7023cd402d67028a085c85cff6ba79c52d8b1e61c42ddddf">PAULI_Z</a></div><div class="ttdeci">@ PAULI_Z</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00096">QuEST.h:96</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa121d55f2ca09c06a96ddcd433c60b0f"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f">statevec_setAmps</a></div><div class="ttdeci">void statevec_setAmps(Qureg qureg, long long int startInd, qreal *reals, qreal *imags, long long int numAmps)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00153">QuEST_gpu.cu:153</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5f96311d9094c382074ad70d4b789612"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">densmatr_mixTwoQubitDepolarisingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixTwoQubitDepolarisingKernel(qreal depolLevel, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int part4, long long int part5, long long int rowCol1, long long int rowCol2)</div><div class="ttdoc">Called once for every 16 amplitudes.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03076">QuEST_gpu.cu:3076</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a2ad72f168181763513d7793c13bf2a91">DISTANCE</a></div><div class="ttdeci">@ DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="astructQuESTEnv_html_aa648bb336cf8598467cb62db00b9cee8"><div class="ttname"><a href="structQuESTEnv.html#aa648bb336cf8598467cb62db00b9cee8">QuESTEnv::rank</a></div><div class="ttdeci">int rank</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00364">QuEST.h:364</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa662796ea6e0f471143c53becae8c12c"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a></div><div class="ttdeci">void statevec_multiControlledPhaseShift(Qureg qureg, int *controlQubits, int numControlQubits, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01558">QuEST_gpu.cu:1558</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0aabd5ed69a74e5bc0b46a17af45c886"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a></div><div class="ttdeci">int GPUExists(void)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00446">QuEST_gpu.cu:446</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aea20d173141544e6c5359955a1fbe997"><div class="ttname"><a href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a></div><div class="ttdeci">__global__ void copySharedReduceBlock(qreal *arrayIn, qreal *reducedArray, int length)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01951">QuEST_gpu.cu:1951</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a31772904f024efd8d75a022e84c8207b"><div class="ttname"><a href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a></div><div class="ttdeci">void swapDouble(qreal **a, qreal **b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02057">QuEST_gpu.cu:2057</a></div></div>
<div class="ttc" id="agroup__debug_html_gae53fad7ebafccf236ad62b41e3244214"><div class="ttname"><a href="group__debug.html#gae53fad7ebafccf236ad62b41e3244214">seedQuESTDefault</a></div><div class="ttdeci">void seedQuESTDefault(QuESTEnv *env)</div><div class="ttdoc">Seeds the random number generator with the (master node) current time and process ID.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8c_source.html#l01614">QuEST.c:1614</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_af6f0087743a115ed303cd4733b9f9494"><div class="ttname"><a href="QuEST__gpu_8cu.html#af6f0087743a115ed303cd4733b9f9494">statevec_applyPhaseFuncOverridesKernel</a></div><div class="ttdeci">__global__ void statevec_applyPhaseFuncOverridesKernel(Qureg qureg, int *qubits, int numQubits, enum bitEncoding encoding, qreal *coeffs, qreal *exponents, int numTerms, long long int *overrideInds, qreal *overridePhases, int numOverrides, int conj)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03522">QuEST_gpu.cu:3522</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afd7fc4d67072a80dbc609bf328b5be20"><div class="ttname"><a href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20">statevec_multiControlledMultiQubitUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledMultiQubitUnitaryKernel(Qureg qureg, long long int ctrlMask, int *targs, int numTargs, qreal *uRe, qreal *uIm, long long int *ampInds, qreal *reAmps, qreal *imAmps, long long int numTargAmps)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00980">QuEST_gpu.cu:980</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9f4bb112d5e95abb8e35bf051a02a06e"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e">densmatr_initClassicalStateKernel</a></div><div class="ttdeci">__global__ void densmatr_initClassicalStateKernel(long long int densityNumElems, qreal *densityReal, qreal *densityImag, long long int densityInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00239">QuEST_gpu.cu:239</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a05756b45f10135bb2eeb07380f806c20"><div class="ttname"><a href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20">statevec_initStateFromSingleFile</a></div><div class="ttdeci">int statevec_initStateFromSingleFile(Qureg *qureg, char filename[200], QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00727">QuEST_gpu.cu:727</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_ada3bffa8e414f883e415dd74e46cd879"><div class="ttname"><a href="structDiagonalOp.html#ada3bffa8e414f883e415dd74e46cd879">DiagonalOp::numChunks</a></div><div class="ttdeci">int numChunks</div><div class="ttdoc">The number of nodes between which the elements of this operator are split.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00304">QuEST.h:304</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_af1cca787f3b0e0c91ffb2495f9ad8d5a"><div class="ttname"><a href="QuEST__gpu_8cu.html#af1cca787f3b0e0c91ffb2495f9ad8d5a">statevec_pauliY</a></div><div class="ttdeci">void statevec_pauliY(Qureg qureg, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01393">QuEST_gpu.cu:1393</a></div></div>
<div class="ttc" id="astructQureg_html_aba97773694870ef35e378c036f486bb7"><div class="ttname"><a href="structQureg.html#aba97773694870ef35e378c036f486bb7">Qureg::pairStateVec</a></div><div class="ttdeci">ComplexArray pairStateVec</div><div class="ttdoc">Temporary storage for a chunk of the state vector received from another process in the MPI version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00343">QuEST.h:343</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5a34c2468f9c21c35ccca1b5e491e238"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5a34c2468f9c21c35ccca1b5e491e238">statevec_findProbabilityOfZero</a></div><div class="ttdeci">qreal statevec_findProbabilityOfZero(Qureg qureg, int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02112">QuEST_gpu.cu:2112</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1275d604674224d87a173fb5bac78835"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1275d604674224d87a173fb5bac78835">statevec_controlledCompactUnitary</a></div><div class="ttdeci">void statevec_controlledCompactUnitary(Qureg qureg, int controlQubit, int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00911">QuEST_gpu.cu:911</a></div></div>
<div class="ttc" id="aQuEST__internal_8h_html"><div class="ttname"><a href="QuEST__internal_8h.html">QuEST_internal.h</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aecc4bcc79c74153d924edfd2edb930cf"><div class="ttname"><a href="QuEST__gpu_8cu.html#aecc4bcc79c74153d924edfd2edb930cf">densmatr_calcExpecDiagonalOpKernel</a></div><div class="ttdeci">__global__ void densmatr_calcExpecDiagonalOpKernel(int getRealComp, qreal *matReal, qreal *matImag, qreal *opReal, qreal *opImag, int numQubits, long long int numTermsToSum, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03367">QuEST_gpu.cu:3367</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1e8f917ab42d38d8c37ba6816b24f2f5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1e8f917ab42d38d8c37ba6816b24f2f5">agnostic_syncDiagonalOp</a></div><div class="ttdeci">void agnostic_syncDiagonalOp(DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00382">QuEST_gpu.cu:382</a></div></div>
<div class="ttc" id="agroup__debug_html_gadc5c01d8ea32e28c188db52be26116b6"><div class="ttname"><a href="group__debug.html#gadc5c01d8ea32e28c188db52be26116b6">getEnvironmentString</a></div><div class="ttdeci">void getEnvironmentString(QuESTEnv env, char str[200])</div><div class="ttdoc">Sets str to a string containing information about the runtime environment, including whether simulati...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00505">QuEST_gpu.cu:505</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2f95208e214543c15c3e16cc2e091d5c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2f95208e214543c15c3e16cc2e091d5c">statevec_controlledPhaseShiftKernel</a></div><div class="ttdeci">__global__ void statevec_controlledPhaseShiftKernel(Qureg qureg, int idQubit1, int idQubit2, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01502">QuEST_gpu.cu:1502</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad72dbcf6d0153db1b8d8a58001feed83"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a></div><div class="ttdeci">#define DEBUG</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00020">QuEST_gpu.cu:20</a></div></div>
<div class="ttc" id="astructQuESTEnv_html_a46e67e1a5ab930e04ff59f83f1d8630d"><div class="ttname"><a href="structQuESTEnv.html#a46e67e1a5ab930e04ff59f83f1d8630d">QuESTEnv::numSeeds</a></div><div class="ttdeci">int numSeeds</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00367">QuEST.h:367</a></div></div>
<div class="ttc" id="aQuEST_8h_html"><div class="ttname"><a href="QuEST_8h.html">QuEST.h</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a754e4531aa159461177751dd12e988ed"><div class="ttname"><a href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed">statevec_multiRotateZKernel</a></div><div class="ttdeci">__global__ void statevec_multiRotateZKernel(Qureg qureg, long long int mask, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01571">QuEST_gpu.cu:1571</a></div></div>
<div class="ttc" id="astructQureg_html_aa3deb7163aab90a61e755a1f200f5413"><div class="ttname"><a href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">Qureg::numChunks</a></div><div class="ttdeci">int numChunks</div><div class="ttdoc">Number of chunks the state vector is broken up into – the number of MPI processes used.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00338">QuEST.h:338</a></div></div>
<div class="ttc" id="agroup__type_html_gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c"><div class="ttname"><a href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a9aa2a35d92976c7de970506c4d19a96c">TWOS_COMPLEMENT</a></div><div class="ttdeci">@ TWOS_COMPLEMENT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00269">QuEST.h:269</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac26cd978b61d5c9a23be9f0aceb96ced"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac26cd978b61d5c9a23be9f0aceb96ced">densmatr_applyDiagonalOpKernel</a></div><div class="ttdeci">__global__ void densmatr_applyDiagonalOpKernel(Qureg qureg, DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03217">QuEST_gpu.cu:3217</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_aebb8af156861c4bc0dd4f35f6982570a"><div class="ttname"><a href="structDiagonalOp.html#aebb8af156861c4bc0dd4f35f6982570a">DiagonalOp::deviceOperator</a></div><div class="ttdeci">ComplexArray deviceOperator</div><div class="ttdoc">A copy of the elements stored persistently on the GPU.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00312">QuEST.h:312</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_affbd18d7c2ed8d5bd5edb67116501145"><div class="ttname"><a href="QuEST__gpu_8cu.html#affbd18d7c2ed8d5bd5edb67116501145">statevec_multiControlledTwoQubitUnitary</a></div><div class="ttdeci">void statevec_multiControlledTwoQubitUnitary(Qureg qureg, long long int ctrlMask, int q1, int q2, ComplexMatrix4 u)</div><div class="ttdoc">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01172">QuEST_gpu.cu:1172</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8e15b37c8dd7514a5480381699aa82c2"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2">densmatr_calcHilbertSchmidtDistanceSquaredKernel</a></div><div class="ttdeci">__global__ void densmatr_calcHilbertSchmidtDistanceSquaredKernel(qreal *aRe, qreal *aIm, qreal *bRe, qreal *bIm, long long int numAmpsToSum, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02569">QuEST_gpu.cu:2569</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aaf78491e35d165edfd57387f9fffecbd"><div class="ttname"><a href="QuEST__gpu_8cu.html#aaf78491e35d165edfd57387f9fffecbd">statevec_controlledPhaseFlip</a></div><div class="ttdeci">void statevec_controlledPhaseFlip(Qureg qureg, int idQubit1, int idQubit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01708">QuEST_gpu.cu:1708</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_aa91713a22c95a383bba55e56c4a4e37a"><div class="ttname"><a href="structDiagonalOp.html#aa91713a22c95a383bba55e56c4a4e37a">DiagonalOp::chunkId</a></div><div class="ttdeci">int chunkId</div><div class="ttdoc">The position of the chunk of the operator held by this process in the full operator.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00306">QuEST.h:306</a></div></div>
<div class="ttc" id="astructQureg_html_ac181d7b3b94fff179dc74d7935ecd9e1"><div class="ttname"><a href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">Qureg::deviceStateVec</a></div><div class="ttdeci">ComplexArray deviceStateVec</div><div class="ttdoc">Storage for wavefunction amplitudes in the GPU version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00346">QuEST.h:346</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abc9a9ef4344c7faaaf28ac25c76649b9"><div class="ttname"><a href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9">statevec_getRealAmp</a></div><div class="ttdeci">qreal statevec_getRealAmp(Qureg qureg, long long int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00569">QuEST_gpu.cu:569</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae003ec1158e3a4e295616ced12af154e">NORM</a></div><div class="ttdeci">@ NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a365bbb1b80cb00405c8bf1a4fa1ea8e5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5">statevec_createQureg</a></div><div class="ttdeci">void statevec_createQureg(Qureg *qureg, int numQubits, QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00275">QuEST_gpu.cu:275</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6ff3dc624b5fafe8edae4fe327c255a0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0">densmatr_calcInnerProduct</a></div><div class="ttdeci">qreal densmatr_calcInnerProduct(Qureg a, Qureg b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02313">QuEST_gpu.cu:2313</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7e0a6e9de648b33168d7f56eba53aa7b"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">densmatr_mixDampingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDampingKernel(qreal damping, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</div><div class="ttdoc">Works like mixDephasing but modifies every other element, and elements are averaged in pairs.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03001">QuEST_gpu.cu:3001</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_af3fc7bd149c70f083b149050242cd55e"><div class="ttname"><a href="QuEST__gpu_8cu.html#af3fc7bd149c70f083b149050242cd55e">statevec_hadamard</a></div><div class="ttdeci">void statevec_hadamard(Qureg qureg, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01826">QuEST_gpu.cu:1826</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab33437d10c1ce1c4b034c7c411db553f"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab33437d10c1ce1c4b034c7c411db553f">statevec_applyMultiVarPhaseFuncOverrides</a></div><div class="ttdeci">void statevec_applyMultiVarPhaseFuncOverrides(Qureg qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum bitEncoding encoding, qreal *coeffs, qreal *exponents, int *numTermsPerReg, long long int *overrideInds, qreal *overridePhases, int numOverrides, int conj)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03695">QuEST_gpu.cu:3695</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a34c5af075a18c7d6513a3d41284f1ab3"><div class="ttname"><a href="QuEST__gpu_8cu.html#a34c5af075a18c7d6513a3d41284f1ab3">statevec_calcExpecDiagonalOpKernel</a></div><div class="ttdeci">__global__ void statevec_calcExpecDiagonalOpKernel(int getRealComp, qreal *vecReal, qreal *vecImag, qreal *opReal, qreal *opImag, long long int numTermsToSum, qreal *reducedArray)</div><div class="ttdoc">computes either a real or imag term of |vec_i|^2 op_i</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03249">QuEST_gpu.cu:3249</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html"><div class="ttname"><a href="structComplexMatrix4.html">ComplexMatrix4</a></div><div class="ttdoc">Represents a 4x4 matrix of complex numbers.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00175">QuEST.h:175</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a01be2e229994aaffd9f73e966e515fd5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a01be2e229994aaffd9f73e966e515fd5">densmatr_oneQubitDegradeOffDiagonal</a></div><div class="ttdeci">void densmatr_oneQubitDegradeOffDiagonal(Qureg qureg, int targetQubit, qreal dephFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02879">QuEST_gpu.cu:2879</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae5114537389194302c7a619e35e6e227">SCALED_INVERSE_DISTANCE</a></div><div class="ttdeci">@ SCALED_INVERSE_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad27d13bcdcbe777e139a90c2e8d52924"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">densmatr_mixTwoQubitDephasingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixTwoQubitDephasingKernel(qreal fac, qreal *vecReal, qreal *vecImag, long long int numBackgroundStates, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int part4, long long int part5, long long int colBit1, long long int rowBit1, long long int colBit2, long long int rowBit2)</div><div class="ttdoc">Called 12 times for every 16 amplitudes in density matrix Each sums from the |..0....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02914">QuEST_gpu.cu:2914</a></div></div>
<div class="ttc" id="astructQuESTEnv_html"><div class="ttname"><a href="structQuESTEnv.html">QuESTEnv</a></div><div class="ttdoc">Information about the environment the program is running in.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00362">QuEST.h:362</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a288dc4b46bdacd69cbf4a6fd070d26a7"><div class="ttname"><a href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7">statevec_initClassicalState</a></div><div class="ttdeci">void statevec_initClassicalState(Qureg qureg, long long int stateInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00668">QuEST_gpu.cu:668</a></div></div>
<div class="ttc" id="agroup__type_html_gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae"><div class="ttname"><a href="group__type.html#gga9c91c41aa42ae537995e89ffc616afe1a7165f9a47792f47c718ca128556fb3ae">UNSIGNED</a></div><div class="ttdeci">@ UNSIGNED</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00269">QuEST.h:269</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a96460613669152314d4680a8603af650"><div class="ttname"><a href="QuEST__gpu_8cu.html#a96460613669152314d4680a8603af650">densmatr_calcProbOfAllOutcomes</a></div><div class="ttdeci">void densmatr_calcProbOfAllOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02259">QuEST_gpu.cu:2259</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0acfe30083d0bc2a84da196378a36122"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0acfe30083d0bc2a84da196378a36122">statevec_multiControlledMultiQubitUnitary</a></div><div class="ttdeci">void statevec_multiControlledMultiQubitUnitary(Qureg qureg, long long int ctrlMask, int *targs, int numTargs, ComplexMatrixN u)</div><div class="ttdoc">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks ...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01039">QuEST_gpu.cu:1039</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html"><div class="ttname"><a href="structComplexMatrixN.html">ComplexMatrixN</a></div><div class="ttdoc">Represents a general 2^N by 2^N matrix of complex numbers.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00186">QuEST.h:186</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a6313e6ff48163c11c47866c4fda4bfa0">INVERSE_DISTANCE</a></div><div class="ttdeci">@ INVERSE_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="amt19937ar_8h_html"><div class="ttname"><a href="mt19937ar_8h.html">mt19937ar.h</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6153547f245c05874161a105e9a2f02c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c">densmatr_calcTotalProb</a></div><div class="ttdeci">qreal densmatr_calcTotalProb(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01632">QuEST_gpu.cu:1632</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac4ee5979d475e8c729294b8ef7e0270d"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a></div><div class="ttdeci">void statevec_multiControlledPhaseFlip(Qureg qureg, int *controlQubits, int numControlQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01734">QuEST_gpu.cu:1734</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab1bc0bf471c4459dd845adbfac5ef857"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab1bc0bf471c4459dd845adbfac5ef857">statevec_controlledCompactUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_controlledCompactUnitaryKernel(Qureg qureg, int controlQubit, int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00852">QuEST_gpu.cu:852</a></div></div>
<div class="ttc" id="agroup__type_html_ga7740e349b4f8bae6451547680f0ce2d6"><div class="ttname"><a href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a></div><div class="ttdeci">#define qreal</div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac3735bd959600e57b2ee3a105666cddf"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac3735bd959600e57b2ee3a105666cddf">statevec_unitary</a></div><div class="ttdeci">void statevec_unitary(Qureg qureg, int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00972">QuEST_gpu.cu:972</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a008becc4a18f868340836e0ab9fd6df6"><div class="ttname"><a href="QuEST__gpu_8cu.html#a008becc4a18f868340836e0ab9fd6df6">statevec_collapseToKnownProbOutcome</a></div><div class="ttdeci">void statevec_collapseToKnownProbOutcome(Qureg qureg, int measureQubit, int outcome, qreal outcomeProb)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02770">QuEST_gpu.cu:2770</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1c82b5e914a8a39c5c7b782dbc16fa76"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1c82b5e914a8a39c5c7b782dbc16fa76">statevec_pauliX</a></div><div class="ttdeci">void statevec_pauliX(Qureg qureg, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01360">QuEST_gpu.cu:1360</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a20a155f53efc45c16803d7539c2c199d"><div class="ttname"><a href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d">densmatr_initClassicalState</a></div><div class="ttdeci">void densmatr_initClassicalState(Qureg qureg, long long int stateInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00258">QuEST_gpu.cu:258</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae1b7788cf504ec3d79de3855f97929c7"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int flipBit(const long long int number, const int bitInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00095">QuEST_gpu.cu:95</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a19e364fb77ebe56afd7cd7cc6de12449"><div class="ttname"><a href="QuEST__gpu_8cu.html#a19e364fb77ebe56afd7cd7cc6de12449">statevec_unitaryKernel</a></div><div class="ttdeci">__global__ void statevec_unitaryKernel(Qureg qureg, int targetQubit, ArgMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00919">QuEST_gpu.cu:919</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab1f13b1980ec46bac75e97c578d15e98"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98">statevec_multiControlledPhaseFlipKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledPhaseFlipKernel(Qureg qureg, long long int mask)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01716">QuEST_gpu.cu:1716</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2ca0c6ba07ab2b4b437321bf17efc966"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966">statevec_initZeroState</a></div><div class="ttdeci">void statevec_initZeroState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00620">QuEST_gpu.cu:620</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_acd94d5e3794824e757731e50d3d018c6"><div class="ttname"><a href="QuEST__gpu_8cu.html#acd94d5e3794824e757731e50d3d018c6">statevec_findProbabilityOfZeroKernel</a></div><div class="ttdeci">__global__ void statevec_findProbabilityOfZeroKernel(Qureg qureg, int measureQubit, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01998">QuEST_gpu.cu:1998</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0ac752f618123ed417cf0e6358c07fde"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0ac752f618123ed417cf0e6358c07fde">statevec_applyDiagonalOpKernel</a></div><div class="ttdeci">__global__ void statevec_applyDiagonalOpKernel(Qureg qureg, DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03187">QuEST_gpu.cu:3187</a></div></div>
<div class="ttc" id="astructQureg_html_a0a86e8a50ea8c998b4a0a6640c5a1218"><div class="ttname"><a href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">Qureg::numQubitsInStateVec</a></div><div class="ttdeci">int numQubitsInStateVec</div><div class="ttdoc">Number of qubits in the state-vector - this is double the number represented for mixed states.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00329">QuEST.h:329</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2116805f30cb063a0e7c0341583d1550"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550">statevec_initBlankStateKernel</a></div><div class="ttdeci">__global__ void statevec_initBlankStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00583">QuEST_gpu.cu:583</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a63cb88a5f4eb12fef087435b8db3f8eb"><div class="ttname"><a href="QuEST__gpu_8cu.html#a63cb88a5f4eb12fef087435b8db3f8eb">statevec_calcProbOfOutcome</a></div><div class="ttdeci">qreal statevec_calcProbOfOutcome(Qureg qureg, int measureQubit, int outcome)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02150">QuEST_gpu.cu:2150</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a3ed30f823a59890be17441d97ce90c5c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a3ed30f823a59890be17441d97ce90c5c">statevec_multiControlledMultiRotateZ</a></div><div class="ttdeci">void statevec_multiControlledMultiRotateZ(Qureg qureg, long long int ctrlMask, long long int targMask, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01621">QuEST_gpu.cu:1621</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9d7928473aca695a614e9c24d903e578"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9d7928473aca695a614e9c24d903e578">statevec_applyPhaseFuncOverrides</a></div><div class="ttdeci">void statevec_applyPhaseFuncOverrides(Qureg qureg, int *qubits, int numQubits, enum bitEncoding encoding, qreal *coeffs, qreal *exponents, int numTerms, long long int *overrideInds, qreal *overridePhases, int numOverrides, int conj)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03576">QuEST_gpu.cu:3576</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">statevec_calcTotalProb</a></div><div class="ttdeci">qreal statevec_calcTotalProb(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01655">QuEST_gpu.cu:1655</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a24d53b07592f424e5cc3dcd12f51bf32"><div class="ttname"><a href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">densmatr_calcInnerProductKernel</a></div><div class="ttdeci">__global__ void densmatr_calcInnerProductKernel(Qureg a, Qureg b, long long int numTermsToSum, qreal *reducedArray)</div><div class="ttdoc">computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij), which is a real number</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02292">QuEST_gpu.cu:2292</a></div></div>
<div class="ttc" id="astructQureg_html_ac2929e681d3d95591c18cf168dbbe4f0"><div class="ttname"><a href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">Qureg::chunkId</a></div><div class="ttdeci">int chunkId</div><div class="ttdoc">The position of the chunk of the state vector held by this process in the full state vector.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00336">QuEST.h:336</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a535cc3c9962d511078691e4d64b4e272"><div class="ttname"><a href="QuEST__gpu_8cu.html#a535cc3c9962d511078691e4d64b4e272">statevec_phaseShiftByTerm</a></div><div class="ttdeci">void statevec_phaseShiftByTerm(Qureg qureg, int targetQubit, Complex term)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01491">QuEST_gpu.cu:1491</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html_a3a2b60a9e00ccef054a6de3b9307c1be"><div class="ttname"><a href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">ComplexMatrix2::imag</a></div><div class="ttdeci">qreal imag[2][2]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00140">QuEST.h:140</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae6cecbad32a03416138b321cdc1a2c33"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33">statevec_compareStates</a></div><div class="ttdeci">int statevec_compareStates(Qureg mq1, Qureg mq2, qreal precision)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00771">QuEST_gpu.cu:771</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5c6f1b2c71f43e57de4a1f818ddfbfd0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBit(const long long int number, const int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00099">QuEST_gpu.cu:99</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a85c3f52533efe831bbe40b9a48602388"><div class="ttname"><a href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">DiagonalOp::imag</a></div><div class="ttdeci">qreal * imag</div><div class="ttdoc">The imaginary values of the 2^numQubits complex elements.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00310">QuEST.h:310</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8adaba9dbdad6f7ab41ae4b8db0abefe"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe">densmatr_mixDensityMatrix</a></div><div class="ttdeci">void densmatr_mixDensityMatrix(Qureg combineQureg, qreal otherProb, Qureg otherQureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02846">QuEST_gpu.cu:2846</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a73167d054e4e8e7bfce4e3e8480c292d"><div class="ttname"><a href="QuEST__gpu_8cu.html#a73167d054e4e8e7bfce4e3e8480c292d">densmatr_findProbabilityOfZero</a></div><div class="ttdeci">qreal densmatr_findProbabilityOfZero(Qureg qureg, int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02064">QuEST_gpu.cu:2064</a></div></div>
<div class="ttc" id="agroup__type_html_gaa7d869b117ba5024d6b84938e8cdfc65"><div class="ttname"><a href="group__type.html#gaa7d869b117ba5024d6b84938e8cdfc65">phaseFunc</a></div><div class="ttdeci">phaseFunc</div><div class="ttdoc">Flags for specifying named phase functions.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00231">QuEST.h:231</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a61f547009235f367c6f983f8768dae19"><div class="ttname"><a href="QuEST__gpu_8cu.html#a61f547009235f367c6f983f8768dae19">statevec_pauliXKernel</a></div><div class="ttdeci">__global__ void statevec_pauliXKernel(Qureg qureg, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01316">QuEST_gpu.cu:1316</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1775b7abce55ccfd036bd5f55707877c"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a></div><div class="ttdeci">__forceinline__ __device__ int getBitMaskParity(long long int mask)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00086">QuEST_gpu.cu:86</a></div></div>
<div class="ttc" id="astructQureg_html_ab0ea0358482b62f43fdd781469607d97"><div class="ttname"><a href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">Qureg::numAmpsPerChunk</a></div><div class="ttdeci">long long int numAmpsPerChunk</div><div class="ttdoc">Number of probability amplitudes held in stateVec by this process In the non-MPI version,...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00332">QuEST.h:332</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a27294e3065ebe42a65b3b9e0f85551dd"><div class="ttname"><a href="QuEST__gpu_8cu.html#a27294e3065ebe42a65b3b9e0f85551dd">statevec_applyDiagonalOp</a></div><div class="ttdeci">void statevec_applyDiagonalOp(Qureg qureg, DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03209">QuEST_gpu.cu:3209</a></div></div>
<div class="ttc" id="astructPauliHamil_html_ac1c6c9f6299cf83bbba88123216c3cac"><div class="ttname"><a href="structPauliHamil.html#ac1c6c9f6299cf83bbba88123216c3cac">PauliHamil::termCoeffs</a></div><div class="ttdeci">qreal * termCoeffs</div><div class="ttdoc">The real coefficient of each Pauli product. This is an array of length PauliHamil....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00283">QuEST.h:283</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae5ad68d054875913d0f7ec654840a9ec"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec">densmatr_initPureState</a></div><div class="ttdeci">void densmatr_initPureState(Qureg targetQureg, Qureg copyQureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00205">QuEST_gpu.cu:205</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac2d127c660168c2462601e4eca100740"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac2d127c660168c2462601e4eca100740">statevec_multiControlledMultiQubitNotKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledMultiQubitNotKernel(Qureg qureg, int ctrlMask, int targMask)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01881">QuEST_gpu.cu:1881</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad2c5cb1c21c9d6cab081b820d1ba4995"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad2c5cb1c21c9d6cab081b820d1ba4995">statevec_phaseShiftByTermKernel</a></div><div class="ttdeci">__global__ void statevec_phaseShiftByTermKernel(Qureg qureg, int targetQubit, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01463">QuEST_gpu.cu:1463</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a13ecc24b355a5213d745651cde56bd71"><div class="ttname"><a href="QuEST__gpu_8cu.html#a13ecc24b355a5213d745651cde56bd71">statevec_multiControlledMultiQubitNot</a></div><div class="ttdeci">void statevec_multiControlledMultiQubitNot(Qureg qureg, int ctrlMask, int targMask)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01918">QuEST_gpu.cu:1918</a></div></div>
<div class="ttc" id="astructPauliHamil_html_a4b8d38c403553c07ceddcd40c46ce6c8"><div class="ttname"><a href="structPauliHamil.html#a4b8d38c403553c07ceddcd40c46ce6c8">PauliHamil::pauliCodes</a></div><div class="ttdeci">enum pauliOpType * pauliCodes</div><div class="ttdoc">The Pauli operators acting on each qubit, flattened over every operator.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00281">QuEST.h:281</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a43b35abfab0d6093b052e2c2e4b15064"><div class="ttname"><a href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064">statevec_initZeroStateKernel</a></div><div class="ttdeci">__global__ void statevec_initZeroStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00604">QuEST_gpu.cu:604</a></div></div>
<div class="ttc" id="agroup__debug_html_ga11448560006dd165128e404b54ebb2f7"><div class="ttname"><a href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a></div><div class="ttdeci">void copyStateToGPU(Qureg qureg)</div><div class="ttdoc">In GPU mode, this copies the state-vector (or density matrix) from RAM (qureg.stateVec) to VRAM / GPU...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00519">QuEST_gpu.cu:519</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa57d77a0903e334e963c66ddc5ed3f53"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a></div><div class="ttdeci">#define REDUCE_SHARED_SIZE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00019">QuEST_gpu.cu:19</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a31a29a30f92fe34c35098f941adbbc93">SCALED_PRODUCT</a></div><div class="ttdeci">@ SCALED_PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afe005f9f69319901bb56c4d022359ad5"><div class="ttname"><a href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5">densmatr_calcPurityKernel</a></div><div class="ttdeci">__global__ void densmatr_calcPurityKernel(qreal *vecReal, qreal *vecImag, long long int numAmpsToSum, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02645">QuEST_gpu.cu:2645</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0b84e6766bd682708e6211276ff0a5bb"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0b84e6766bd682708e6211276ff0a5bb">agnostic_createDiagonalOp</a></div><div class="ttdeci">DiagonalOp agnostic_createDiagonalOp(int numQubits, QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00338">QuEST_gpu.cu:338</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afd14cca643241a991ac172a826311eca"><div class="ttname"><a href="QuEST__gpu_8cu.html#afd14cca643241a991ac172a826311eca">statevec_calcProbOfAllOutcomes</a></div><div class="ttdeci">void statevec_calcProbOfAllOutcomes(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02207">QuEST_gpu.cu:2207</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad5b7e25e42427dfa7f19fd950264bb16"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad5b7e25e42427dfa7f19fd950264bb16">statevec_applyParamNamedPhaseFuncOverrides</a></div><div class="ttdeci">void statevec_applyParamNamedPhaseFuncOverrides(Qureg qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum bitEncoding encoding, enum phaseFunc phaseFuncName, qreal *params, int numParams, long long int *overrideInds, qreal *overridePhases, int numOverrides, int conj)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03909">QuEST_gpu.cu:3909</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abd509244d57657e148e4084c5ab5d28f"><div class="ttname"><a href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f">statevec_getImagAmp</a></div><div class="ttdeci">qreal statevec_getImagAmp(Qureg qureg, long long int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00576">QuEST_gpu.cu:576</a></div></div>
<div class="ttc" id="astructQuESTEnv_html_af22aacd7c9905accae28484785c193b4"><div class="ttname"><a href="structQuESTEnv.html#af22aacd7c9905accae28484785c193b4">QuESTEnv::numRanks</a></div><div class="ttdeci">int numRanks</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00365">QuEST.h:365</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html_a1f6bb840b5a9e6252980cab7a14f1a35"><div class="ttname"><a href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">ComplexMatrix4::imag</a></div><div class="ttdeci">qreal imag[4][4]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00178">QuEST.h:178</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae37b3eff5d3affbc1edfe216cabc1c53"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae37b3eff5d3affbc1edfe216cabc1c53">densmatr_calcProbOfOutcome</a></div><div class="ttdeci">qreal densmatr_calcProbOfOutcome(Qureg qureg, int measureQubit, int outcome)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02158">QuEST_gpu.cu:2158</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aec63559e8b9ab0e17efe18d64d2ceca6"><div class="ttname"><a href="QuEST__gpu_8cu.html#aec63559e8b9ab0e17efe18d64d2ceca6">statevec_compactUnitary</a></div><div class="ttdeci">void statevec_compactUnitary(Qureg qureg, int targetQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00844">QuEST_gpu.cu:844</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a5131eeb67aafb4c19ac98270c3266742"><div class="ttname"><a href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">DiagonalOp::numQubits</a></div><div class="ttdeci">int numQubits</div><div class="ttdoc">The number of qubits this operator can act on (informing its size)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00300">QuEST.h:300</a></div></div>
<div class="ttc" id="astructPauliHamil_html_a737e46b40ef8990cf004d22eb9dbe2e4"><div class="ttname"><a href="structPauliHamil.html#a737e46b40ef8990cf004d22eb9dbe2e4">PauliHamil::numSumTerms</a></div><div class="ttdeci">int numSumTerms</div><div class="ttdoc">The number of terms in the weighted sum, or the number of Pauli products.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00285">QuEST.h:285</a></div></div>
<div class="ttc" id="aQuEST__common_8c_html_acc45bb8300922ea5933e294921e25ea2"><div class="ttname"><a href="QuEST__common_8c.html#acc45bb8300922ea5933e294921e25ea2">getQubitBitMask</a></div><div class="ttdeci">long long int getQubitBitMask(int *qubits, int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00050">QuEST_common.c:50</a></div></div>
<div class="ttc" id="astructDiagonalOp_html"><div class="ttname"><a href="structDiagonalOp.html">DiagonalOp</a></div><div class="ttdoc">Represents a diagonal complex operator on the full Hilbert state of a Qureg.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00297">QuEST.h:297</a></div></div>
<div class="ttc" id="astructPauliHamil_html"><div class="ttname"><a href="structPauliHamil.html">PauliHamil</a></div><div class="ttdoc">A Pauli Hamiltonian, expressed as a real-weighted sum of pauli products, and which can hence represen...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00277">QuEST.h:277</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a9bac39238e100b0f845dc6e4deafc1c9"><div class="ttname"><a href="QuEST__gpu_8cu.html#a9bac39238e100b0f845dc6e4deafc1c9">insertZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBits(long long int number, int *inds, const int numInds)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00112">QuEST_gpu.cu:112</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a70e3b0a2297c186d5c779af31459b4ca"><div class="ttname"><a href="QuEST__gpu_8cu.html#a70e3b0a2297c186d5c779af31459b4ca">densmatr_calcExpecDiagonalOp</a></div><div class="ttdeci">Complex densmatr_calcExpecDiagonalOp(Qureg qureg, DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03412">QuEST_gpu.cu:3412</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a37c6a59b2dd008d235474cb7248df952"><div class="ttname"><a href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">densmatr_mixDephasingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDephasingKernel(qreal fac, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int colBit, long long int rowBit)</div><div class="ttdoc">Called once for every 4 amplitudes in density matrix Works by establishing the |.....</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02863">QuEST_gpu.cu:2863</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65aa318172feec5b530e9a7849f2f7b44e7">SCALED_INVERSE_SHIFTED_NORM</a></div><div class="ttdeci">@ SCALED_INVERSE_SHIFTED_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a112c74b3365bda6697813d9931b55377"><div class="ttname"><a href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377">getNumReductionLevels</a></div><div class="ttdeci">int getNumReductionLevels(long long int numValuesToReduce, int numReducedPerLevel)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02048">QuEST_gpu.cu:2048</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aac71aef8fca67e5a0547ea2d3426d40d"><div class="ttname"><a href="QuEST__gpu_8cu.html#aac71aef8fca67e5a0547ea2d3426d40d">statevec_multiControlledMultiRotateZKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledMultiRotateZKernel(Qureg qureg, long long int ctrlMask, long long int targMask, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01599">QuEST_gpu.cu:1599</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_a446e8a077597e4f76049d547df0c9738"><div class="ttname"><a href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">ComplexMatrixN::real</a></div><div class="ttdeci">qreal ** real</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00189">QuEST.h:189</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afcf7b425ab92924c15b0b95b0d64c307"><div class="ttname"><a href="QuEST__gpu_8cu.html#afcf7b425ab92924c15b0b95b0d64c307">statevec_hadamardKernel</a></div><div class="ttdeci">__global__ void statevec_hadamardKernel(Qureg qureg, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01777">QuEST_gpu.cu:1777</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1653a2901d0a843e00127e7150c31384"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1653a2901d0a843e00127e7150c31384">statevec_controlledPhaseFlipKernel</a></div><div class="ttdeci">__global__ void statevec_controlledPhaseFlipKernel(Qureg qureg, int idQubit1, int idQubit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01687">QuEST_gpu.cu:1687</a></div></div>
<div class="ttc" id="astructQureg_html_a8bb9f7517470a0cc406951935f37b64f"><div class="ttname"><a href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">Qureg::secondLevelReduction</a></div><div class="ttdeci">qreal * secondLevelReduction</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00348">QuEST.h:348</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4cf98d55602d1138a2101c158095afdc"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc">densmatr_initPlusStateKernel</a></div><div class="ttdeci">__global__ void densmatr_initPlusStateKernel(long long int stateVecSize, qreal probFactor, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00216">QuEST_gpu.cu:216</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aec1852e1a8e70d3690919ce8ab551ba0"><div class="ttname"><a href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a></div><div class="ttdeci">__forceinline__ __device__ int extractBit(const int locationOfBitFromRight, const long long int theEncodedNumber)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00082">QuEST_gpu.cu:82</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aeb0039eccca94ba644a8728d91eff5bb"><div class="ttname"><a href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">densmatr_mixDepolarisingKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDepolarisingKernel(qreal depolLevel, qreal *vecReal, qreal *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</div><div class="ttdoc">Works like mixDephasing but modifies every other element, and elements are averaged in pairs.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02975">QuEST_gpu.cu:2975</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a43afa97e300b87bce7f3eb1213eb05f6"><div class="ttname"><a href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6">densmatr_mixTwoQubitDepolarising</a></div><div class="ttdeci">void densmatr_mixTwoQubitDepolarising(Qureg qureg, int qubit1, int qubit2, qreal depolLevel)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03108">QuEST_gpu.cu:3108</a></div></div>
<div class="ttc" id="astructQuESTEnv_html_a66feaa60d3adc7dcf6f8b66514989356"><div class="ttname"><a href="structQuESTEnv.html#a66feaa60d3adc7dcf6f8b66514989356">QuESTEnv::seeds</a></div><div class="ttdeci">unsigned long int * seeds</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00366">QuEST.h:366</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab2ffd422f8c4e334277263bb4efe2a61"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab2ffd422f8c4e334277263bb4efe2a61">statevec_calcProbOfAllOutcomesKernel</a></div><div class="ttdeci">__global__ void statevec_calcProbOfAllOutcomesKernel(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02186">QuEST_gpu.cu:2186</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a63df1ec14ff7cc81c3f392ac10fcc744"><div class="ttname"><a href="QuEST__gpu_8cu.html#a63df1ec14ff7cc81c3f392ac10fcc744">statevec_controlledPhaseShift</a></div><div class="ttdeci">void statevec_controlledPhaseShift(Qureg qureg, int idQubit1, int idQubit2, qreal angle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01527">QuEST_gpu.cu:1527</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a8c9da88f734b0862f4cce7d819e6d3b5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5">densmatr_calcHilbertSchmidtDistance</a></div><div class="ttdeci">qreal densmatr_calcHilbertSchmidtDistance(Qureg a, Qureg b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02593">QuEST_gpu.cu:2593</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a623e577b7230f3c8dc202be6185b4289"><div class="ttname"><a href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a></div><div class="ttdeci">void densmatr_mixTwoQubitDephasing(Qureg qureg, int qubit1, int qubit2, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02938">QuEST_gpu.cu:2938</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a758bad4237ff0bf3b4ff5be626a982ae"><div class="ttname"><a href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae">statevec_initBlankState</a></div><div class="ttdeci">void statevec_initBlankState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00593">QuEST_gpu.cu:593</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ad4c32e295c08ebe224e2c5ba6497f043">INVERSE_NORM</a></div><div class="ttdeci">@ INVERSE_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="astructQureg_html"><div class="ttname"><a href="structQureg.html">Qureg</a></div><div class="ttdoc">Represents a system of qubits.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00322">QuEST.h:322</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4e19ef93d01d7acea32ca646d623aedd"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4e19ef93d01d7acea32ca646d623aedd">statevec_controlledPauliY</a></div><div class="ttdeci">void statevec_controlledPauliY(Qureg qureg, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01445">QuEST_gpu.cu:1445</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad947613d4d62b0b659a0be1e9c736427"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427">statevec_initDebugStateKernel</a></div><div class="ttdeci">__global__ void statevec_initDebugStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00679">QuEST_gpu.cu:679</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4760109974e9b52c60e9d60ccded3138"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertTwoZeroBits(const long long int number, const int bit1, const int bit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00106">QuEST_gpu.cu:106</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7ebd3198a198f4cd20840f64fd8b84d0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">statevec_calcInnerProduct</a></div><div class="ttdeci">Complex statevec_calcInnerProduct(Qureg bra, Qureg ket)</div><div class="ttdoc">Terrible code which unnecessarily individually computes and sums the real and imaginary components of...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02393">QuEST_gpu.cu:2393</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_afde13e469a3b4f179f45e53d1ec0a7cf"><div class="ttname"><a href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">ComplexMatrixN::imag</a></div><div class="ttdeci">qreal ** imag</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00190">QuEST.h:190</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5658f2ecbbd4ea425db5f7dc7fc4ba92"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5658f2ecbbd4ea425db5f7dc7fc4ba92">densmatr_collapseToKnownProbOutcome</a></div><div class="ttdeci">void densmatr_collapseToKnownProbOutcome(Qureg qureg, int measureQubit, int outcome, qreal outcomeProb)</div><div class="ttdoc">This involves finding |...i...><...j...| states and killing those where i!=j.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02805">QuEST_gpu.cu:2805</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2b9beefe0873d2c2e8fec68f86e057fc"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2b9beefe0873d2c2e8fec68f86e057fc">statevec_pauliYKernel</a></div><div class="ttdeci">__global__ void statevec_pauliYKernel(Qureg qureg, int targetQubit, int conjFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01368">QuEST_gpu.cu:1368</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a1e57230c7995447039e62a84c0a36524"><div class="ttname"><a href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">statevec_reportStateToScreen</a></div><div class="ttdeci">void statevec_reportStateToScreen(Qureg qureg, QuESTEnv env, int reportRank)</div><div class="ttdoc">Print the current state vector of probability amplitudes for a set of qubits to standard out.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00543">QuEST_gpu.cu:543</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65acb6911398e0068f545a31b82bcdef3e4">PRODUCT</a></div><div class="ttdeci">@ PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0f1817fe73e2911937af3979b6506ebd"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd">statevec_initClassicalStateKernel</a></div><div class="ttdeci">__global__ void statevec_initClassicalStateKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag, long long int stateInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00653">QuEST_gpu.cu:653</a></div></div>
<div class="ttc" id="aQuEST__precision_8h_html"><div class="ttname"><a href="QuEST__precision_8h.html">QuEST_precision.h</a></div></div>
<div class="ttc" id="astructQureg_html_a441e4cacef6bd17adb9813c7442d42fe"><div class="ttname"><a href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">Qureg::stateVec</a></div><div class="ttdeci">ComplexArray stateVec</div><div class="ttdoc">Computational state amplitudes - a subset thereof in the MPI version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00341">QuEST.h:341</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4f3c49fa4904bb120bbb6ae2e6395dfd"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">statevec_calcInnerProductKernel</a></div><div class="ttdeci">__global__ void statevec_calcInnerProductKernel(int getRealComp, qreal *vecReal1, qreal *vecImag1, qreal *vecReal2, qreal *vecImag2, long long int numTermsToSum, qreal *reducedArray)</div><div class="ttdoc">computes either a real or imag term in the inner product</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02363">QuEST_gpu.cu:2363</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab558d79a6d1caa98999255246db6dcf2"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab558d79a6d1caa98999255246db6dcf2">densmatr_findProbabilityOfZeroKernel</a></div><div class="ttdeci">__global__ void densmatr_findProbabilityOfZeroKernel(Qureg qureg, int measureQubit, qreal *reducedArray)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01960">QuEST_gpu.cu:1960</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html_a3ea98d545b67a190ee6abe936c72076f"><div class="ttname"><a href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">ComplexMatrix2::real</a></div><div class="ttdeci">qreal real[2][2]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00139">QuEST.h:139</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0ab7d9b8126b7074f21ba3e2316dd246"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0ab7d9b8126b7074f21ba3e2316dd246">statevec_applyParamNamedPhaseFuncOverridesKernel</a></div><div class="ttdeci">__global__ void statevec_applyParamNamedPhaseFuncOverridesKernel(Qureg qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum bitEncoding encoding, enum phaseFunc phaseFuncName, qreal *params, int numParams, long long int *overrideInds, qreal *overridePhases, int numOverrides, long long int *phaseInds, int conj)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03760">QuEST_gpu.cu:3760</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a2c6eab631ef48b4978db026c98180eee"><div class="ttname"><a href="structDiagonalOp.html#a2c6eab631ef48b4978db026c98180eee">DiagonalOp::numElemsPerChunk</a></div><div class="ttdeci">long long int numElemsPerChunk</div><div class="ttdoc">The number of the 2^numQubits amplitudes stored on each distributed node.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00302">QuEST.h:302</a></div></div>
<div class="ttc" id="astructQureg_html_acf78445e9435d09f44f0cc832c6aee79"><div class="ttname"><a href="structQureg.html#acf78445e9435d09f44f0cc832c6aee79">Qureg::isDensityMatrix</a></div><div class="ttdeci">int isDensityMatrix</div><div class="ttdoc">Whether this instance is a density-state representation.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00325">QuEST.h:325</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac65fd6109f08a191a7811ddf72886d55"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac65fd6109f08a191a7811ddf72886d55">statevec_controlledPauliYKernel</a></div><div class="ttdeci">__global__ void statevec_controlledPauliYKernel(Qureg qureg, int controlQubit, int targetQubit, int conjFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01409">QuEST_gpu.cu:1409</a></div></div>
<div class="ttc" id="agroup__debug_html_gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><div class="ttname"><a href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">reportQuESTEnv</a></div><div class="ttdeci">void reportQuESTEnv(QuESTEnv env)</div><div class="ttdoc">Report information about the QuEST environment.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00493">QuEST_gpu.cu:493</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_a606f7afbc3f65a596bdca21cb43be6a8"><div class="ttname"><a href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">ComplexMatrixN::numQubits</a></div><div class="ttdeci">int numQubits</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00188">QuEST.h:188</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa31f0ef43a921c3ac73545d1d3670fa1"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a></div><div class="ttdeci">void densmatr_mixDephasing(Qureg qureg, int targetQubit, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02899">QuEST_gpu.cu:2899</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_add9ca9956cdd81ed5d0b0f66168c04a3"><div class="ttname"><a href="QuEST__gpu_8cu.html#add9ca9956cdd81ed5d0b0f66168c04a3">statevec_controlledUnitary</a></div><div class="ttdeci">void statevec_controlledUnitary(Qureg qureg, int controlQubit, int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01237">QuEST_gpu.cu:1237</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad5b2ac0b00afa495f385520b2c5fa839"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839">densmatr_initPlusState</a></div><div class="ttdeci">void densmatr_initPlusState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00226">QuEST_gpu.cu:226</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a81fbd2eccd0d0e5a3cece4df2f96cb92"><div class="ttname"><a href="QuEST__gpu_8cu.html#a81fbd2eccd0d0e5a3cece4df2f96cb92">statevec_pauliYConj</a></div><div class="ttdeci">void statevec_pauliYConj(Qureg qureg, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01401">QuEST_gpu.cu:1401</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a2a52ad9f9ad9b2fd6a76f6d433b3b217"><div class="ttname"><a href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217">statevec_destroyQureg</a></div><div class="ttdeci">void statevec_destroyQureg(Qureg qureg, QuESTEnv env)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00321">QuEST_gpu.cu:321</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_abb2eab4af99adcc59be24f4c91c6f6ad"><div class="ttname"><a href="QuEST__gpu_8cu.html#abb2eab4af99adcc59be24f4c91c6f6ad">statevec_controlledNot</a></div><div class="ttdeci">void statevec_controlledNot(Qureg qureg, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01873">QuEST_gpu.cu:1873</a></div></div>
<div class="ttc" id="astructQureg_html_ad08dff5316b8937f4b2a1417591543dc"><div class="ttname"><a href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">Qureg::numQubitsRepresented</a></div><div class="ttdeci">int numQubitsRepresented</div><div class="ttdoc">The number of qubits represented in either the state-vector or density matrix.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00327">QuEST.h:327</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa4b77089145184d990848cd66993aa8b"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">statevec_cloneQureg</a></div><div class="ttdeci">void statevec_cloneQureg(Qureg targetQureg, Qureg copyQureg)</div><div class="ttdoc">works for both statevectors and density matrices</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00170">QuEST_gpu.cu:170</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_af798bb01f922804016c4c5bc8d0a580f"><div class="ttname"><a href="QuEST__gpu_8cu.html#af798bb01f922804016c4c5bc8d0a580f">agnostic_destroyDiagonalOp</a></div><div class="ttdeci">void agnostic_destroyDiagonalOp(DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00375">QuEST_gpu.cu:375</a></div></div>
<div class="ttc" id="astructQureg_html_adef4935cac95763c29164cf99b144ed4"><div class="ttname"><a href="structQureg.html#adef4935cac95763c29164cf99b144ed4">Qureg::numAmpsTotal</a></div><div class="ttdeci">long long int numAmpsTotal</div><div class="ttdoc">Total number of amplitudes, which are possibly distributed among machines.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00334">QuEST.h:334</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ace23d4b924240a245d83193f0ce398d4">SCALED_DISTANCE</a></div><div class="ttdeci">@ SCALED_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="agroup__debug_html_gac7e38d768a1bd79019f88cc1e6295092"><div class="ttname"><a href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">syncQuESTSuccess</a></div><div class="ttdeci">int syncQuESTSuccess(int successCode)</div><div class="ttdoc">Performs a logical AND on all successCodes held by all processes.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00485">QuEST_gpu.cu:485</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a1d66088bed235d524cd452b107694d5c"><div class="ttname"><a href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">DiagonalOp::real</a></div><div class="ttdeci">qreal * real</div><div class="ttdoc">The real values of the 2^numQubits complex elements.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00308">QuEST.h:308</a></div></div>
<div class="ttc" id="astructComplex_html_ab5b2e2eca02131fc74b289a83636cbe3"><div class="ttname"><a href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">Complex::real</a></div><div class="ttdeci">qreal real</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00105">QuEST.h:105</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac82f3dbf68f877f57d4abbb72fae1254"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a></div><div class="ttdeci">__device__ void reduceBlock(qreal *arrayIn, qreal *reducedArray, int length)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01932">QuEST_gpu.cu:1932</a></div></div>
<div class="ttc" id="astructComplex_html_a84f5439aad0ef495efdd3b4c1c02d27e"><div class="ttname"><a href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">Complex::imag</a></div><div class="ttdeci">qreal imag</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00106">QuEST.h:106</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ace807c2089e172363db9ffe083f60f71"><div class="ttname"><a href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71">statevec_initStateOfSingleQubitKernel</a></div><div class="ttdeci">__global__ void statevec_initStateOfSingleQubitKernel(long long int stateVecSize, qreal *stateVecReal, qreal *stateVecImag, int qubitId, int outcome)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00700">QuEST_gpu.cu:700</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5d2202221eed63dc9b003d716a46e879"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879">statevec_collapseToKnownProbOutcomeKernel</a></div><div class="ttdeci">__global__ void statevec_collapseToKnownProbOutcomeKernel(Qureg qureg, int measureQubit, int outcome, qreal totalProbability)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02713">QuEST_gpu.cu:2713</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aedd7ecccf2f09dd2f1c5d191950b51e6"><div class="ttname"><a href="QuEST__gpu_8cu.html#aedd7ecccf2f09dd2f1c5d191950b51e6">densmatr_applyDiagonalOp</a></div><div class="ttdeci">void densmatr_applyDiagonalOp(Qureg qureg, DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03240">QuEST_gpu.cu:3240</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad9fd3017ea40cf63fd04b39e03494972"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">statevec_initDebugState</a></div><div class="ttdeci">void statevec_initDebugState(Qureg qureg)</div><div class="ttdoc">Initialise the state vector of probability amplitudes to an (unphysical) state with each component of...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00689">QuEST_gpu.cu:689</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a600bda10463e2078ce746ec28f2d39c9"><div class="ttname"><a href="QuEST__gpu_8cu.html#a600bda10463e2078ce746ec28f2d39c9">statevec_multiControlledUnitary</a></div><div class="ttdeci">void statevec_multiControlledUnitary(Qureg qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, int targetQubit, ComplexMatrix2 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01305">QuEST_gpu.cu:1305</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae45eefa65f4ecd37bab84fade7cf7f1f"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">densmatr_calcPurity</a></div><div class="ttdeci">qreal densmatr_calcPurity(Qureg qureg)</div><div class="ttdoc">Computes the trace of the density matrix squared.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02664">QuEST_gpu.cu:2664</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aed40f77bf851930363897f3d28a5093b"><div class="ttname"><a href="QuEST__gpu_8cu.html#aed40f77bf851930363897f3d28a5093b">statevec_multiControlledTwoQubitUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledTwoQubitUnitaryKernel(Qureg qureg, long long int ctrlMask, int q1, int q2, ArgMatrix4 u)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01096">QuEST_gpu.cu:1096</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a39111120b79016d6b3e773b711fa63f7">SCALED_INVERSE_SHIFTED_DISTANCE</a></div><div class="ttdeci">@ SCALED_INVERSE_SHIFTED_DISTANCE</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00234">QuEST.h:234</a></div></div>
<div class="ttc" id="agroup__debug_html_ga555451c697ea4a9d27389155f68fdabc"><div class="ttname"><a href="group__debug.html#ga555451c697ea4a9d27389155f68fdabc">seedQuEST</a></div><div class="ttdeci">void seedQuEST(QuESTEnv *env, unsigned long int *seedArray, int numSeeds)</div><div class="ttdoc">Seeds the random number generator with a custom array of key(s), overriding the default keys.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03965">QuEST_gpu.cu:3965</a></div></div>
<div class="ttc" id="astructComplex_html"><div class="ttname"><a href="structComplex.html">Complex</a></div><div class="ttdoc">Represents one complex number.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00103">QuEST.h:103</a></div></div>
<div class="ttc" id="agroup__type_html_ga8ba2c3388dd64d9348c3b091852d36d4"><div class="ttname"><a href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">createQuESTEnv</a></div><div class="ttdeci">QuESTEnv createQuESTEnv(void)</div><div class="ttdoc">Create the QuEST execution environment.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00463">QuEST_gpu.cu:463</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a923906770cac0da9e3459bae58de9e64"><div class="ttname"><a href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">statevec_initStateOfSingleQubit</a></div><div class="ttdeci">void statevec_initStateOfSingleQubit(Qureg *qureg, int qubitId, int outcome)</div><div class="ttdoc">Initialise the state vector of probability amplitudes such that one qubit is set to 'outcome' and all...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00718">QuEST_gpu.cu:718</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a93c0c1e166dd43c6a57f61e5490808e1">SCALED_NORM</a></div><div class="ttdeci">@ SCALED_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65a1a5168576607f460d3e60f184575cacb">SCALED_INVERSE_PRODUCT</a></div><div class="ttdeci">@ SCALED_INVERSE_PRODUCT</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00233">QuEST.h:233</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ad64a23933361fafc1b6b1787759c2663"><div class="ttname"><a href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663">statevec_setWeightedQureg</a></div><div class="ttdeci">void statevec_setWeightedQureg(Complex fac1, Qureg qureg1, Complex fac2, Qureg qureg2, Complex facOut, Qureg out)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03175">QuEST_gpu.cu:3175</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aa6c3f86010ad398f42b0577ea3bb5bcf"><div class="ttname"><a href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf">densmatr_calcFidelity</a></div><div class="ttdeci">qreal densmatr_calcFidelity(Qureg qureg, Qureg pureState)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02519">QuEST_gpu.cu:2519</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a482fc361fd5f08075404c72e536316a0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0">statevec_initPlusState</a></div><div class="ttdeci">void statevec_initPlusState(Qureg qureg)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00642">QuEST_gpu.cu:642</a></div></div>
<div class="ttc" id="astructQureg_html_a2d0007a026a4231b338a5037c4e861b2"><div class="ttname"><a href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">Qureg::firstLevelReduction</a></div><div class="ttdeci">qreal * firstLevelReduction</div><div class="ttdoc">Storage for reduction of probabilities on GPU.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00348">QuEST.h:348</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4d5c3bc20e1fe6f36e1f92e6d030afc7"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4d5c3bc20e1fe6f36e1f92e6d030afc7">statevec_compactUnitaryKernel</a></div><div class="ttdeci">__global__ void statevec_compactUnitaryKernel(Qureg qureg, int rotQubit, Complex alpha, Complex beta)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00789">QuEST_gpu.cu:789</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5224b64ff81ca7b205c26f01bb704241"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5224b64ff81ca7b205c26f01bb704241">statevec_applyMultiVarPhaseFuncOverridesKernel</a></div><div class="ttdeci">__global__ void statevec_applyMultiVarPhaseFuncOverridesKernel(Qureg qureg, int *qubits, int *numQubitsPerReg, int numRegs, enum bitEncoding encoding, qreal *coeffs, qreal *exponents, int *numTermsPerReg, long long int *overrideInds, qreal *overridePhases, int numOverrides, long long int *phaseInds, int conj)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03611">QuEST_gpu.cu:3611</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ac15269559c1759a1a44971451874cea9"><div class="ttname"><a href="QuEST__gpu_8cu.html#ac15269559c1759a1a44971451874cea9">statevec_controlledNotKernel</a></div><div class="ttdeci">__global__ void statevec_controlledNotKernel(Qureg qureg, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01834">QuEST_gpu.cu:1834</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afcb85940a9f204f77006c3644bd8c13e"><div class="ttname"><a href="QuEST__gpu_8cu.html#afcb85940a9f204f77006c3644bd8c13e">densmatr_calcProbOfAllOutcomesKernel</a></div><div class="ttdeci">__global__ void densmatr_calcProbOfAllOutcomesKernel(qreal *outcomeProbs, Qureg qureg, int *qubits, int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02238">QuEST_gpu.cu:2238</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a0fb948ddab4ca210e523aa3c52639df4"><div class="ttname"><a href="QuEST__gpu_8cu.html#a0fb948ddab4ca210e523aa3c52639df4">statevec_calcExpecDiagonalOp</a></div><div class="ttdeci">Complex statevec_calcExpecDiagonalOp(Qureg qureg, DiagonalOp op)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03276">QuEST_gpu.cu:3276</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ab58d6d599c7a729255b1f8eeded663f3"><div class="ttname"><a href="QuEST__gpu_8cu.html#ab58d6d599c7a729255b1f8eeded663f3">agnostic_setDiagonalOpElems</a></div><div class="ttdeci">void agnostic_setDiagonalOpElems(DiagonalOp op, long long int startInd, qreal *real, qreal *imag, long long int numElems)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03503">QuEST_gpu.cu:3503</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a7f1cf14dd4820a59eb8a9874c2062bef"><div class="ttname"><a href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef">densmatr_mixDensityMatrixKernel</a></div><div class="ttdeci">__global__ void densmatr_mixDensityMatrixKernel(Qureg combineQureg, qreal otherProb, Qureg otherQureg, long long int numAmpsToVisit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02834">QuEST_gpu.cu:2834</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a398b60c4cb4fa2cf2ffc126de6c08da0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a398b60c4cb4fa2cf2ffc126de6c08da0">densmatr_mixDepolarising</a></div><div class="ttdeci">void densmatr_mixDepolarising(Qureg qureg, int targetQubit, qreal depolLevel)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l03022">QuEST_gpu.cu:3022</a></div></div>
<div class="ttc" id="agroup__type_html_ga9c91c41aa42ae537995e89ffc616afe1"><div class="ttname"><a href="group__type.html#ga9c91c41aa42ae537995e89ffc616afe1">bitEncoding</a></div><div class="ttdeci">bitEncoding</div><div class="ttdoc">Flags for specifying how the bits in sub-register computational basis states are mapped to indices in...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00269">QuEST.h:269</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a89a450a1932e4f4f94cf1487af9d263b"><div class="ttname"><a href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b">statevec_swapQubitAmpsKernel</a></div><div class="ttdeci">__global__ void statevec_swapQubitAmpsKernel(Qureg qureg, int qb1, int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01743">QuEST_gpu.cu:1743</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html"><div class="ttname"><a href="structComplexMatrix2.html">ComplexMatrix2</a></div><div class="ttdoc">Represents a 2x2 matrix of complex numbers.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00137">QuEST.h:137</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4a2fa262d3f0dba372797b9bd35d9fa5"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4a2fa262d3f0dba372797b9bd35d9fa5">statevec_controlledPauliYConj</a></div><div class="ttdeci">void statevec_controlledPauliYConj(Qureg qureg, int controlQubit, int targetQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01454">QuEST_gpu.cu:1454</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a090901670793c53a1b08629712b2cdae"><div class="ttname"><a href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">densmatr_calcFidelityKernel</a></div><div class="ttdeci">__global__ void densmatr_calcFidelityKernel(Qureg dens, Qureg vec, long long int dim, qreal *reducedArray)</div><div class="ttdoc">computes one term of (vec^*T) dens * vec</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02481">QuEST_gpu.cu:2481</a></div></div>
<div class="ttc" id="agroup__type_html_ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2"><div class="ttname"><a href="group__type.html#ggaa7d869b117ba5024d6b84938e8cdfc65ae8c96906c1ec109d295c491e572d01e2">SCALED_INVERSE_NORM</a></div><div class="ttdeci">@ SCALED_INVERSE_NORM</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00232">QuEST.h:232</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a11dc3581b1efe1332854eac7594bc647"><div class="ttname"><a href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647">statevec_multiControlledPhaseShiftKernel</a></div><div class="ttdeci">__global__ void statevec_multiControlledPhaseShiftKernel(Qureg qureg, long long int mask, qreal cosAngle, qreal sinAngle)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01538">QuEST_gpu.cu:1538</a></div></div>
<!-- HTML footer for doxygen 1.8.8-->
<!-- start footer part -->
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="boot.js"></script>
</html>