<!-- 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 File Reference</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.1.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_d522931ffa1371640980b621734a4381.html">Users</a></li><li class="navelem"><a class="el" href="dir_70834f0dcd10de01d2e35ab402a2238e.html">tysonjones</a></li><li class="navelem"><a class="el" href="dir_1957401ef452be7528010ba0f4832a45.html">Desktop</a></li><li class="navelem"><a class="el" href="dir_dee4414d5d72b49a9429e079789ffd08.html">GithubRepos</a></li><li class="navelem"><a class="el" href="dir_a89b43d59316bb5045aa22bb53a67d29.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_f1fe56bf5ef15ff22696c757278c6962.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_757750313c878cfe3b7d1ade55b4b819.html">src</a></li><li class="navelem"><a class="el" href="dir_7eb3fa4849c17b542966d4ab4b7cdb3f.html">GPU</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#define-members">Macros</a> |
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">QuEST_gpu.cu File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include "<a class="el" href="QuEST_8h_source.html">QuEST.h</a>"</code><br />
<code>#include "<a class="el" href="QuEST__precision_8h_source.html">QuEST_precision.h</a>"</code><br />
<code>#include "<a class="el" href="QuEST__internal_8h_source.html">QuEST_internal.h</a>"</code><br />
<code>#include "<a class="el" href="mt19937ar_8h_source.html">mt19937ar.h</a>"</code><br />
<code>#include <stdlib.h></code><br />
<code>#include <stdio.h></code><br />
<code>#include <math.h></code><br />
</div>
<p><a href="QuEST__gpu_8cu_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:ad72dbcf6d0153db1b8d8a58001feed83"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad72dbcf6d0153db1b8d8a58001feed83">DEBUG</a>   0</td></tr>
<tr class="separator:ad72dbcf6d0153db1b8d8a58001feed83"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa57d77a0903e334e963c66ddc5ed3f53"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>   512</td></tr>
<tr class="separator:aa57d77a0903e334e963c66ddc5ed3f53"><td class="memSeparator" colspan="2"> </td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:aea20d173141544e6c5359955a1fbe997"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *arrayIn, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, int length)</td></tr>
<tr class="separator:aea20d173141544e6c5359955a1fbe997"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga924ef2dbda6b733b4041270077c76ece"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ga924ef2dbda6b733b4041270077c76ece"><td class="mdescLeft"> </td><td class="mdescRight">In GPU mode, this copies the state-vector (or density matrix) from GPU memory (qureg.deviceStateVec) to RAM (qureg.stateVec), where it can be accessed/modified by the user. <a href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">More...</a><br /></td></tr>
<tr class="separator:ga924ef2dbda6b733b4041270077c76ece"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga11448560006dd165128e404b54ebb2f7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ga11448560006dd165128e404b54ebb2f7"><td class="mdescLeft"> </td><td class="mdescRight">In GPU mode, this copies the state-vector (or density matrix) from RAM (qureg.stateVec) to VRAM / GPU-memory (qureg.deviceStateVec), which is the version operated upon by other calls to the API. <a href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">More...</a><br /></td></tr>
<tr class="separator:ga11448560006dd165128e404b54ebb2f7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga8ba2c3388dd64d9348c3b091852d36d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">createQuESTEnv</a> (void)</td></tr>
<tr class="memdesc:ga8ba2c3388dd64d9348c3b091852d36d4"><td class="mdescLeft"> </td><td class="mdescRight">Create the QuEST execution environment. <a href="group__type.html#ga8ba2c3388dd64d9348c3b091852d36d4">More...</a><br /></td></tr>
<tr class="separator:ga8ba2c3388dd64d9348c3b091852d36d4"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa6c3f86010ad398f42b0577ea3bb5bcf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa6c3f86010ad398f42b0577ea3bb5bcf">densmatr_calcFidelity</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQureg.html">Qureg</a> pureState)</td></tr>
<tr class="separator:aa6c3f86010ad398f42b0577ea3bb5bcf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a090901670793c53a1b08629712b2cdae"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">densmatr_calcFidelityKernel</a> (<a class="el" href="structQureg.html">Qureg</a> dens, <a class="el" href="structQureg.html">Qureg</a> vec, long long int dim, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a090901670793c53a1b08629712b2cdae"><td class="mdescLeft"> </td><td class="mdescRight">computes one term of (vec^*T) dens * vec <a href="QuEST__gpu_8cu.html#a090901670793c53a1b08629712b2cdae">More...</a><br /></td></tr>
<tr class="separator:a090901670793c53a1b08629712b2cdae"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8c9da88f734b0862f4cce7d819e6d3b5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8c9da88f734b0862f4cce7d819e6d3b5">densmatr_calcHilbertSchmidtDistance</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b)</td></tr>
<tr class="separator:a8c9da88f734b0862f4cce7d819e6d3b5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8e15b37c8dd7514a5480381699aa82c2"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8e15b37c8dd7514a5480381699aa82c2">densmatr_calcHilbertSchmidtDistanceSquaredKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aRe, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aIm, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bRe, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bIm, long long int numAmpsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:a8e15b37c8dd7514a5480381699aa82c2"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6ff3dc624b5fafe8edae4fe327c255a0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6ff3dc624b5fafe8edae4fe327c255a0">densmatr_calcInnerProduct</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b)</td></tr>
<tr class="separator:a6ff3dc624b5fafe8edae4fe327c255a0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a24d53b07592f424e5cc3dcd12f51bf32"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">densmatr_calcInnerProductKernel</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b, long long int numTermsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a24d53b07592f424e5cc3dcd12f51bf32"><td class="mdescLeft"> </td><td class="mdescRight">computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij), which is a real number <a href="QuEST__gpu_8cu.html#a24d53b07592f424e5cc3dcd12f51bf32">More...</a><br /></td></tr>
<tr class="separator:a24d53b07592f424e5cc3dcd12f51bf32"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad405e3fac20997043e0236b751e44270"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad405e3fac20997043e0236b751e44270">densmatr_calcProbOfOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit, int outcome)</td></tr>
<tr class="separator:ad405e3fac20997043e0236b751e44270"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae45eefa65f4ecd37bab84fade7cf7f1f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">densmatr_calcPurity</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ae45eefa65f4ecd37bab84fade7cf7f1f"><td class="mdescLeft"> </td><td class="mdescRight">Computes the trace of the density matrix squared. <a href="QuEST__gpu_8cu.html#ae45eefa65f4ecd37bab84fade7cf7f1f">More...</a><br /></td></tr>
<tr class="separator:ae45eefa65f4ecd37bab84fade7cf7f1f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afe005f9f69319901bb56c4d022359ad5"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afe005f9f69319901bb56c4d022359ad5">densmatr_calcPurityKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, long long int numAmpsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:afe005f9f69319901bb56c4d022359ad5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6153547f245c05874161a105e9a2f02c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6153547f245c05874161a105e9a2f02c">densmatr_calcTotalProb</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a6153547f245c05874161a105e9a2f02c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab321af37fe3490253e12b7c70b8d2a98"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab321af37fe3490253e12b7c70b8d2a98">densmatr_collapseToKnownProbOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb)</td></tr>
<tr class="memdesc:ab321af37fe3490253e12b7c70b8d2a98"><td class="mdescLeft"> </td><td class="mdescRight">This involves finding |...i...><...j...| states and killing those where i!=j. <a href="QuEST__gpu_8cu.html#ab321af37fe3490253e12b7c70b8d2a98">More...</a><br /></td></tr>
<tr class="separator:ab321af37fe3490253e12b7c70b8d2a98"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afc4dcedaf429d823f4da83d3521d8293"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">densmatr_collapseToKnownProbOutcomeKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:afc4dcedaf429d823f4da83d3521d8293"><td class="mdescLeft"> </td><td class="mdescRight">Maps thread ID to a |..0..><..0..| state and then locates |0><1|, |1><0| and |1><1|. <a href="QuEST__gpu_8cu.html#afc4dcedaf429d823f4da83d3521d8293">More...</a><br /></td></tr>
<tr class="separator:afc4dcedaf429d823f4da83d3521d8293"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afbb044d76bf22d5c81a2a70a977f29bc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc">densmatr_findProbabilityOfZero</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit)</td></tr>
<tr class="separator:afbb044d76bf22d5c81a2a70a977f29bc"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a3414d9307ecfd0caa2be560a00eb7c61"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a3414d9307ecfd0caa2be560a00eb7c61">densmatr_findProbabilityOfZeroKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:a3414d9307ecfd0caa2be560a00eb7c61"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a20a155f53efc45c16803d7539c2c199d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a20a155f53efc45c16803d7539c2c199d">densmatr_initClassicalState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int stateInd)</td></tr>
<tr class="separator:a20a155f53efc45c16803d7539c2c199d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9f4bb112d5e95abb8e35bf051a02a06e"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9f4bb112d5e95abb8e35bf051a02a06e">densmatr_initClassicalStateKernel</a> (long long int densityNumElems, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *densityImag, long long int densityInd)</td></tr>
<tr class="separator:a9f4bb112d5e95abb8e35bf051a02a06e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad5b2ac0b00afa495f385520b2c5fa839"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad5b2ac0b00afa495f385520b2c5fa839">densmatr_initPlusState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:ad5b2ac0b00afa495f385520b2c5fa839"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4cf98d55602d1138a2101c158095afdc"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4cf98d55602d1138a2101c158095afdc">densmatr_initPlusStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> probFactor, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:a4cf98d55602d1138a2101c158095afdc"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae5ad68d054875913d0f7ec654840a9ec"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae5ad68d054875913d0f7ec654840a9ec">densmatr_initPureState</a> (<a class="el" href="structQureg.html">Qureg</a> targetQureg, <a class="el" href="structQureg.html">Qureg</a> copyQureg)</td></tr>
<tr class="separator:ae5ad68d054875913d0f7ec654840a9ec"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a664339e2afc50b0418a56adfc1bc512e"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a664339e2afc50b0418a56adfc1bc512e">densmatr_initPureStateKernel</a> (long long int numPureAmps, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *targetVecImag, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *copyVecImag)</td></tr>
<tr class="separator:a664339e2afc50b0418a56adfc1bc512e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a72b26b971531dbdc64de20501f368545"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a72b26b971531dbdc64de20501f368545">densmatr_mixDamping</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping)</td></tr>
<tr class="separator:a72b26b971531dbdc64de20501f368545"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7e0a6e9de648b33168d7f56eba53aa7b"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">densmatr_mixDampingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</td></tr>
<tr class="memdesc:a7e0a6e9de648b33168d7f56eba53aa7b"><td class="mdescLeft"> </td><td class="mdescRight">Works like mixDephasing but modifies every other element, and elements are averaged in pairs. <a href="QuEST__gpu_8cu.html#a7e0a6e9de648b33168d7f56eba53aa7b">More...</a><br /></td></tr>
<tr class="separator:a7e0a6e9de648b33168d7f56eba53aa7b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8adaba9dbdad6f7ab41ae4b8db0abefe"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8adaba9dbdad6f7ab41ae4b8db0abefe">densmatr_mixDensityMatrix</a> (<a class="el" href="structQureg.html">Qureg</a> combineQureg, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="el" href="structQureg.html">Qureg</a> otherQureg)</td></tr>
<tr class="separator:a8adaba9dbdad6f7ab41ae4b8db0abefe"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7f1cf14dd4820a59eb8a9874c2062bef"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7f1cf14dd4820a59eb8a9874c2062bef">densmatr_mixDensityMatrixKernel</a> (<a class="el" href="structQureg.html">Qureg</a> combineQureg, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> otherProb, <a class="el" href="structQureg.html">Qureg</a> otherQureg, long long int numAmpsToVisit)</td></tr>
<tr class="separator:a7f1cf14dd4820a59eb8a9874c2062bef"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a515b6a920b1715d4eae25dcf29f39b95"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95">densmatr_mixDephasing</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase)</td></tr>
<tr class="separator:a515b6a920b1715d4eae25dcf29f39b95"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a37c6a59b2dd008d235474cb7248df952"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">densmatr_mixDephasingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:a37c6a59b2dd008d235474cb7248df952"><td class="mdescLeft"> </td><td class="mdescRight">Called once for every 4 amplitudes in density matrix Works by establishing the |..0..><..0..| state (for its given index) then visiting |..1..><..0..| and |..0..><..1..|. <a href="QuEST__gpu_8cu.html#a37c6a59b2dd008d235474cb7248df952">More...</a><br /></td></tr>
<tr class="separator:a37c6a59b2dd008d235474cb7248df952"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a3765e92c79d4c2a0df6761a0e7da2676"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a3765e92c79d4c2a0df6761a0e7da2676">densmatr_mixDepolarising</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel)</td></tr>
<tr class="separator:a3765e92c79d4c2a0df6761a0e7da2676"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aeb0039eccca94ba644a8728d91eff5bb"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">densmatr_mixDepolarisingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag, long long int numAmpsToVisit, long long int part1, long long int part2, long long int part3, long long int bothBits)</td></tr>
<tr class="memdesc:aeb0039eccca94ba644a8728d91eff5bb"><td class="mdescLeft"> </td><td class="mdescRight">Works like mixDephasing but modifies every other element, and elements are averaged in pairs. <a href="QuEST__gpu_8cu.html#aeb0039eccca94ba644a8728d91eff5bb">More...</a><br /></td></tr>
<tr class="separator:aeb0039eccca94ba644a8728d91eff5bb"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a623e577b7230f3c8dc202be6185b4289"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase)</td></tr>
<tr class="separator:a623e577b7230f3c8dc202be6185b4289"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad27d13bcdcbe777e139a90c2e8d52924"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">densmatr_mixTwoQubitDephasingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fac, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:ad27d13bcdcbe777e139a90c2e8d52924"><td class="mdescLeft"> </td><td class="mdescRight">Called 12 times for every 16 amplitudes in density matrix Each sums from the |..0..0..><..0..0..| index to visit either |..0..0..><..0..1..|, |..0..0..><..1..0..|, |..0..0..><..1..1..|, |..0..1..><..0..0..| etc and so on to |..1..1..><..1..0|. <a href="QuEST__gpu_8cu.html#ad27d13bcdcbe777e139a90c2e8d52924">More...</a><br /></td></tr>
<tr class="separator:ad27d13bcdcbe777e139a90c2e8d52924"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a43afa97e300b87bce7f3eb1213eb05f6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a43afa97e300b87bce7f3eb1213eb05f6">densmatr_mixTwoQubitDepolarising</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel)</td></tr>
<tr class="separator:a43afa97e300b87bce7f3eb1213eb05f6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5f96311d9094c382074ad70d4b789612"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">densmatr_mixTwoQubitDepolarisingKernel</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *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)</td></tr>
<tr class="memdesc:a5f96311d9094c382074ad70d4b789612"><td class="mdescLeft"> </td><td class="mdescRight">Called once for every 16 amplitudes. <a href="QuEST__gpu_8cu.html#a5f96311d9094c382074ad70d4b789612">More...</a><br /></td></tr>
<tr class="separator:a5f96311d9094c382074ad70d4b789612"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a303c00c3329a7bf290b68468735b4a8f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac)</td></tr>
<tr class="separator:a303c00c3329a7bf290b68468735b4a8f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaeff624226629d7063a8a776958a4f991"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__type.html#gaeff624226629d7063a8a776958a4f991">destroyQuESTEnv</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="memdesc:gaeff624226629d7063a8a776958a4f991"><td class="mdescLeft"> </td><td class="mdescRight">Destroy the QuEST environment. <a href="group__type.html#gaeff624226629d7063a8a776958a4f991">More...</a><br /></td></tr>
<tr class="separator:gaeff624226629d7063a8a776958a4f991"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5cb8662afc6c644a46f7339c89bfd226"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (int locationOfBitFromRight, long long int theEncodedNumber)</td></tr>
<tr class="separator:a5cb8662afc6c644a46f7339c89bfd226"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6aea6cf9c06d05a5765ad01311531627"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a> (long long int number, int bitInd)</td></tr>
<tr class="separator:a6aea6cf9c06d05a5765ad01311531627"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1775b7abce55ccfd036bd5f55707877c"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1775b7abce55ccfd036bd5f55707877c">getBitMaskParity</a> (long long int mask)</td></tr>
<tr class="separator:a1775b7abce55ccfd036bd5f55707877c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga2d955c6e51067371eee69795532a2d62"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga2d955c6e51067371eee69795532a2d62">getEnvironmentString</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env, <a class="el" href="structQureg.html">Qureg</a> qureg, char str[200])</td></tr>
<tr class="memdesc:ga2d955c6e51067371eee69795532a2d62"><td class="mdescLeft"> </td><td class="mdescRight">Sets <code>str</code> to a string containing the number of qubits in <code>qureg</code>, and the hardware facilities used (e.g. <a href="group__debug.html#ga2d955c6e51067371eee69795532a2d62">More...</a><br /></td></tr>
<tr class="separator:ga2d955c6e51067371eee69795532a2d62"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a112c74b3365bda6697813d9931b55377"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a112c74b3365bda6697813d9931b55377">getNumReductionLevels</a> (long long int numValuesToReduce, int numReducedPerLevel)</td></tr>
<tr class="separator:a112c74b3365bda6697813d9931b55377"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0aabd5ed69a74e5bc0b46a17af45c886"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0aabd5ed69a74e5bc0b46a17af45c886">GPUExists</a> (void)</td></tr>
<tr class="separator:a0aabd5ed69a74e5bc0b46a17af45c886"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a60b4893613de0cd6595f60cdec24999a"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a> (long long int number, int bit1, int bit2)</td></tr>
<tr class="separator:a60b4893613de0cd6595f60cdec24999a"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4536acc227ff24e63aaf47b2b42e765f"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a> (long long int number, int index)</td></tr>
<tr class="separator:a4536acc227ff24e63aaf47b2b42e765f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5f14823d1125e973c4b350bd6ac84552"><td class="memItemLeft" align="right" valign="top">__forceinline__ __device__ long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5f14823d1125e973c4b350bd6ac84552">insertZeroBits</a> (long long int number, int *inds, int numInds)</td></tr>
<tr class="separator:a5f14823d1125e973c4b350bd6ac84552"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8ce1e311ea72b862a8757dc71082fbf3"><td class="memItemLeft" align="right" valign="top">__device__ __host__ unsigned int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a> (unsigned int x)</td></tr>
<tr class="separator:a8ce1e311ea72b862a8757dc71082fbf3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac82f3dbf68f877f57d4abbb72fae1254"><td class="memItemLeft" align="right" valign="top">__device__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *arrayIn, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray, int length)</td></tr>
<tr class="separator:ac82f3dbf68f877f57d4abbb72fae1254"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">reportQuESTEnv</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="memdesc:gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><td class="mdescLeft"> </td><td class="mdescRight">Report information about the QuEST environment. <a href="group__debug.html#gaf8a14ae79c3fb2c0b5f6255cc37bebf9">More...</a><br /></td></tr>
<tr class="separator:gaf8a14ae79c3fb2c0b5f6255cc37bebf9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gaa8437ef3bf135231e2916e64dde1c94e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#gaa8437ef3bf135231e2916e64dde1c94e">seedQuESTDefault</a> ()</td></tr>
<tr class="memdesc:gaa8437ef3bf135231e2916e64dde1c94e"><td class="mdescLeft"> </td><td class="mdescRight">Seed the Mersenne Twister used for random number generation in the QuEST environment with an example defualt seed. <a href="group__debug.html#gaa8437ef3bf135231e2916e64dde1c94e">More...</a><br /></td></tr>
<tr class="separator:gaa8437ef3bf135231e2916e64dde1c94e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7ebd3198a198f4cd20840f64fd8b84d0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">statevec_calcInnerProduct</a> (<a class="el" href="structQureg.html">Qureg</a> bra, <a class="el" href="structQureg.html">Qureg</a> ket)</td></tr>
<tr class="memdesc:a7ebd3198a198f4cd20840f64fd8b84d0"><td class="mdescLeft"> </td><td class="mdescRight">Terrible code which unnecessarily individually computes and sums the real and imaginary components of the inner product, so as to not have to worry about keeping the sums separated during reduction. <a href="QuEST__gpu_8cu.html#a7ebd3198a198f4cd20840f64fd8b84d0">More...</a><br /></td></tr>
<tr class="separator:a7ebd3198a198f4cd20840f64fd8b84d0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4f3c49fa4904bb120bbb6ae2e6395dfd"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">statevec_calcInnerProductKernel</a> (int getRealComp, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal1, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag1, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecReal2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecImag2, long long int numTermsToSum, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="memdesc:a4f3c49fa4904bb120bbb6ae2e6395dfd"><td class="mdescLeft"> </td><td class="mdescRight">computes either a real or imag term in the inner product <a href="QuEST__gpu_8cu.html#a4f3c49fa4904bb120bbb6ae2e6395dfd">More...</a><br /></td></tr>
<tr class="separator:a4f3c49fa4904bb120bbb6ae2e6395dfd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab33cdf01831c4545e51299178acf7f27"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab33cdf01831c4545e51299178acf7f27">statevec_calcProbOfOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit, int outcome)</td></tr>
<tr class="separator:ab33cdf01831c4545e51299178acf7f27"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">statevec_calcTotalProb</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa4b77089145184d990848cd66993aa8b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">statevec_cloneQureg</a> (<a class="el" href="structQureg.html">Qureg</a> targetQureg, <a class="el" href="structQureg.html">Qureg</a> copyQureg)</td></tr>
<tr class="memdesc:aa4b77089145184d990848cd66993aa8b"><td class="mdescLeft"> </td><td class="mdescRight">works for both statevectors and density matrices <a href="QuEST__gpu_8cu.html#aa4b77089145184d990848cd66993aa8b">More...</a><br /></td></tr>
<tr class="separator:aa4b77089145184d990848cd66993aa8b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae7f25bb40734e18a992403b17355893b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae7f25bb40734e18a992403b17355893b">statevec_collapseToKnownProbOutcome</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb)</td></tr>
<tr class="separator:ae7f25bb40734e18a992403b17355893b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5d2202221eed63dc9b003d716a46e879"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5d2202221eed63dc9b003d716a46e879">statevec_collapseToKnownProbOutcomeKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability)</td></tr>
<tr class="separator:a5d2202221eed63dc9b003d716a46e879"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a94ee4df9faba286ad7a5bc829ef5174d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a94ee4df9faba286ad7a5bc829ef5174d">statevec_compactUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a94ee4df9faba286ad7a5bc829ef5174d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1338d7ca4e83bbb81da02aca456c53e6"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1338d7ca4e83bbb81da02aca456c53e6">statevec_compactUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int rotQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a1338d7ca4e83bbb81da02aca456c53e6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae6cecbad32a03416138b321cdc1a2c33"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ae6cecbad32a03416138b321cdc1a2c33">statevec_compareStates</a> (<a class="el" href="structQureg.html">Qureg</a> mq1, <a class="el" href="structQureg.html">Qureg</a> mq2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> precision)</td></tr>
<tr class="separator:ae6cecbad32a03416138b321cdc1a2c33"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a47b467a5445c7f15d1a8b0b2ec0ef2de"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a47b467a5445c7f15d1a8b0b2ec0ef2de">statevec_controlledCompactUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a47b467a5445c7f15d1a8b0b2ec0ef2de"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a55fdf6604434dab8a5c0b8522b6cc10c"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a55fdf6604434dab8a5c0b8522b6cc10c">statevec_controlledCompactUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a55fdf6604434dab8a5c0b8522b6cc10c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a114038296eb404b9b8a66aaad7b48800"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a114038296eb404b9b8a66aaad7b48800">statevec_controlledNot</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit)</td></tr>
<tr class="separator:a114038296eb404b9b8a66aaad7b48800"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aca8a32f46dbaabdbffc38d7b8023bf20"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aca8a32f46dbaabdbffc38d7b8023bf20">statevec_controlledNotKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit)</td></tr>
<tr class="separator:aca8a32f46dbaabdbffc38d7b8023bf20"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a708246b16236c492094c2633da0c08ff"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a708246b16236c492094c2633da0c08ff">statevec_controlledPauliY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit)</td></tr>
<tr class="separator:a708246b16236c492094c2633da0c08ff"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9e647339720bf82b30c6331fad544ec5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9e647339720bf82b30c6331fad544ec5">statevec_controlledPauliYConj</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit)</td></tr>
<tr class="separator:a9e647339720bf82b30c6331fad544ec5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9c7dfe745a3bb35f18440891d267e963"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9c7dfe745a3bb35f18440891d267e963">statevec_controlledPauliYKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, const int conjFac)</td></tr>
<tr class="separator:a9c7dfe745a3bb35f18440891d267e963"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7c0067cb9f243ead20de7392aea328bc"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7c0067cb9f243ead20de7392aea328bc">statevec_controlledPhaseFlip</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int idQubit1, const int idQubit2)</td></tr>
<tr class="separator:a7c0067cb9f243ead20de7392aea328bc"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abf9e7eae332bbbd2e8b7b9c3ca3bad92"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abf9e7eae332bbbd2e8b7b9c3ca3bad92">statevec_controlledPhaseFlipKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int idQubit1, const int idQubit2)</td></tr>
<tr class="separator:abf9e7eae332bbbd2e8b7b9c3ca3bad92"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:adeb715f3f2c167f9bfbe92b75f5988ce"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#adeb715f3f2c167f9bfbe92b75f5988ce">statevec_controlledPhaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int idQubit1, const int idQubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:adeb715f3f2c167f9bfbe92b75f5988ce"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af7723faf3f94342480a54fc2137522ce"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#af7723faf3f94342480a54fc2137522ce">statevec_controlledPhaseShiftKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int idQubit1, const int idQubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:af7723faf3f94342480a54fc2137522ce"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2600999a19c817bfcf7ca14779e33b9a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2600999a19c817bfcf7ca14779e33b9a">statevec_controlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:a2600999a19c817bfcf7ca14779e33b9a"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4295d3add539f787362b56adf5d155f0"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4295d3add539f787362b56adf5d155f0">statevec_controlledUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int controlQubit, const int targetQubit, ArgMatrix2 u)</td></tr>
<tr class="separator:a4295d3add539f787362b56adf5d155f0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a365bbb1b80cb00405c8bf1a4fa1ea8e5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a365bbb1b80cb00405c8bf1a4fa1ea8e5">statevec_createQureg</a> (<a class="el" href="structQureg.html">Qureg</a> *qureg, int numQubits, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a365bbb1b80cb00405c8bf1a4fa1ea8e5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2a52ad9f9ad9b2fd6a76f6d433b3b217"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2a52ad9f9ad9b2fd6a76f6d433b3b217">statevec_destroyQureg</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a2a52ad9f9ad9b2fd6a76f6d433b3b217"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a067da9fba487d5821fbd689718b19de2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2">statevec_findProbabilityOfZero</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit)</td></tr>
<tr class="separator:a067da9fba487d5821fbd689718b19de2"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aae568d73d0de878acffe3798779de474"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aae568d73d0de878acffe3798779de474">statevec_findProbabilityOfZeroKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int measureQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reducedArray)</td></tr>
<tr class="separator:aae568d73d0de878acffe3798779de474"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abd509244d57657e148e4084c5ab5d28f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abd509244d57657e148e4084c5ab5d28f">statevec_getImagAmp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int index)</td></tr>
<tr class="separator:abd509244d57657e148e4084c5ab5d28f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abc9a9ef4344c7faaaf28ac25c76649b9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abc9a9ef4344c7faaaf28ac25c76649b9">statevec_getRealAmp</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int index)</td></tr>
<tr class="separator:abc9a9ef4344c7faaaf28ac25c76649b9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a9226f386d010aaa85efc0e8889d341d5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a9226f386d010aaa85efc0e8889d341d5">statevec_hadamard</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="separator:a9226f386d010aaa85efc0e8889d341d5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a14b5999f157b704aced4776c9ccbc982"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a14b5999f157b704aced4776c9ccbc982">statevec_hadamardKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="separator:a14b5999f157b704aced4776c9ccbc982"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a758bad4237ff0bf3b4ff5be626a982ae"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a758bad4237ff0bf3b4ff5be626a982ae">statevec_initBlankState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a758bad4237ff0bf3b4ff5be626a982ae"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2116805f30cb063a0e7c0341583d1550"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2116805f30cb063a0e7c0341583d1550">statevec_initBlankStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:a2116805f30cb063a0e7c0341583d1550"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a288dc4b46bdacd69cbf4a6fd070d26a7"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a288dc4b46bdacd69cbf4a6fd070d26a7">statevec_initClassicalState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int stateInd)</td></tr>
<tr class="separator:a288dc4b46bdacd69cbf4a6fd070d26a7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0f1817fe73e2911937af3979b6506ebd"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a0f1817fe73e2911937af3979b6506ebd">statevec_initClassicalStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, long long int stateInd)</td></tr>
<tr class="separator:a0f1817fe73e2911937af3979b6506ebd"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad9fd3017ea40cf63fd04b39e03494972"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">statevec_initDebugState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:ad9fd3017ea40cf63fd04b39e03494972"><td class="mdescLeft"> </td><td class="mdescRight">Initialise the state vector of probability amplitudes to an (unphysical) state with each component of each probability amplitude a unique floating point value. <a href="QuEST__gpu_8cu.html#ad9fd3017ea40cf63fd04b39e03494972">More...</a><br /></td></tr>
<tr class="separator:ad9fd3017ea40cf63fd04b39e03494972"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad947613d4d62b0b659a0be1e9c736427"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad947613d4d62b0b659a0be1e9c736427">statevec_initDebugStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:ad947613d4d62b0b659a0be1e9c736427"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a482fc361fd5f08075404c72e536316a0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a482fc361fd5f08075404c72e536316a0">statevec_initPlusState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a482fc361fd5f08075404c72e536316a0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aaa36e3e86a5b79e676c6268fa2b02222"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aaa36e3e86a5b79e676c6268fa2b02222">statevec_initPlusStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:aaa36e3e86a5b79e676c6268fa2b02222"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a05756b45f10135bb2eeb07380f806c20"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a05756b45f10135bb2eeb07380f806c20">statevec_initStateFromSingleFile</a> (<a class="el" href="structQureg.html">Qureg</a> *qureg, char filename[200], <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="separator:a05756b45f10135bb2eeb07380f806c20"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a923906770cac0da9e3459bae58de9e64"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">statevec_initStateOfSingleQubit</a> (<a class="el" href="structQureg.html">Qureg</a> *qureg, int qubitId, int outcome)</td></tr>
<tr class="memdesc:a923906770cac0da9e3459bae58de9e64"><td class="mdescLeft"> </td><td class="mdescRight">Initialise the state vector of probability amplitudes such that one qubit is set to 'outcome' and all other qubits are in an equal superposition of zero and one. <a href="QuEST__gpu_8cu.html#a923906770cac0da9e3459bae58de9e64">More...</a><br /></td></tr>
<tr class="separator:a923906770cac0da9e3459bae58de9e64"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ace807c2089e172363db9ffe083f60f71"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ace807c2089e172363db9ffe083f60f71">statevec_initStateOfSingleQubitKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag, int qubitId, int outcome)</td></tr>
<tr class="separator:ace807c2089e172363db9ffe083f60f71"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2ca0c6ba07ab2b4b437321bf17efc966"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a2ca0c6ba07ab2b4b437321bf17efc966">statevec_initZeroState</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a2ca0c6ba07ab2b4b437321bf17efc966"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a43b35abfab0d6093b052e2c2e4b15064"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a43b35abfab0d6093b052e2c2e4b15064">statevec_initZeroStateKernel</a> (long long int stateVecSize, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag)</td></tr>
<tr class="separator:a43b35abfab0d6093b052e2c2e4b15064"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a47dcab9a0e6b07ddde264ed924add26c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a47dcab9a0e6b07ddde264ed924add26c">statevec_multiControlledMultiQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int *targs, const int numTargs, <a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</td></tr>
<tr class="memdesc:a47dcab9a0e6b07ddde264ed924add26c"><td class="mdescLeft"> </td><td class="mdescRight">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. <a href="QuEST__gpu_8cu.html#a47dcab9a0e6b07ddde264ed924add26c">More...</a><br /></td></tr>
<tr class="separator:a47dcab9a0e6b07ddde264ed924add26c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:afd7fc4d67072a80dbc609bf328b5be20"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#afd7fc4d67072a80dbc609bf328b5be20">statevec_multiControlledMultiQubitUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int *targs, int numTargs, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *uRe, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *uIm, long long int *ampInds, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reAmps, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imAmps, long long int numTargAmps)</td></tr>
<tr class="separator:afd7fc4d67072a80dbc609bf328b5be20"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac4ee5979d475e8c729294b8ef7e0270d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ac4ee5979d475e8c729294b8ef7e0270d">statevec_multiControlledPhaseFlip</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int numControlQubits)</td></tr>
<tr class="separator:ac4ee5979d475e8c729294b8ef7e0270d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab1f13b1980ec46bac75e97c578d15e98"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab1f13b1980ec46bac75e97c578d15e98">statevec_multiControlledPhaseFlipKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask)</td></tr>
<tr class="separator:ab1f13b1980ec46bac75e97c578d15e98"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa662796ea6e0f471143c53becae8c12c"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa662796ea6e0f471143c53becae8c12c">statevec_multiControlledPhaseShift</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int *controlQubits, int numControlQubits, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:aa662796ea6e0f471143c53becae8c12c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a11dc3581b1efe1332854eac7594bc647"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a11dc3581b1efe1332854eac7594bc647">statevec_multiControlledPhaseShiftKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:a11dc3581b1efe1332854eac7594bc647"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a49af21aad0ad254c64a10cb6d39e4a64"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a49af21aad0ad254c64a10cb6d39e4a64">statevec_multiControlledTwoQubitUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, const int q1, const int q2, <a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</td></tr>
<tr class="memdesc:a49af21aad0ad254c64a10cb6d39e4a64"><td class="mdescLeft"> </td><td class="mdescRight">This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. <a href="QuEST__gpu_8cu.html#a49af21aad0ad254c64a10cb6d39e4a64">More...</a><br /></td></tr>
<tr class="separator:a49af21aad0ad254c64a10cb6d39e4a64"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad4ec89e571c55b3d0dee1413a2fd1d43"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad4ec89e571c55b3d0dee1413a2fd1d43">statevec_multiControlledTwoQubitUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, const int q1, const int q2, ArgMatrix4 u)</td></tr>
<tr class="separator:ad4ec89e571c55b3d0dee1413a2fd1d43"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7ec46b4b96cda399095a2488ceff69b6"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a7ec46b4b96cda399095a2488ceff69b6">statevec_multiControlledUnitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:a7ec46b4b96cda399095a2488ceff69b6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6fb74f09125cd2ce2658824182248c6e"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a6fb74f09125cd2ce2658824182248c6e">statevec_multiControlledUnitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlQubitsMask, long long int ctrlFlipMask, const int targetQubit, ArgMatrix2 u)</td></tr>
<tr class="separator:a6fb74f09125cd2ce2658824182248c6e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8d88b4ed94ab024e5e7b2f1f4f505b44"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8d88b4ed94ab024e5e7b2f1f4f505b44">statevec_multiRotateZ</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> angle)</td></tr>
<tr class="separator:a8d88b4ed94ab024e5e7b2f1f4f505b44"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a754e4531aa159461177751dd12e988ed"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a754e4531aa159461177751dd12e988ed">statevec_multiRotateZKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int mask, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:a754e4531aa159461177751dd12e988ed"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abdb6e0ee1e407755e1b944086cedd90e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#abdb6e0ee1e407755e1b944086cedd90e">statevec_pauliX</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="separator:abdb6e0ee1e407755e1b944086cedd90e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab1662a828dc725610a71168a58430fae"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab1662a828dc725610a71168a58430fae">statevec_pauliXKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="separator:ab1662a828dc725610a71168a58430fae"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a73b56fbac6e464a37805fa9d9657a8f9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a73b56fbac6e464a37805fa9d9657a8f9">statevec_pauliY</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="separator:a73b56fbac6e464a37805fa9d9657a8f9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aee97816cfabeea7874cd837a8d105412"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aee97816cfabeea7874cd837a8d105412">statevec_pauliYConj</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit)</td></tr>
<tr class="separator:aee97816cfabeea7874cd837a8d105412"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1f5b1f46708a7c96275e379b873ba2f6"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1f5b1f46708a7c96275e379b873ba2f6">statevec_pauliYKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, const int conjFac)</td></tr>
<tr class="separator:a1f5b1f46708a7c96275e379b873ba2f6"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8972669148af60d7e1c09687f69673d4"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a8972669148af60d7e1c09687f69673d4">statevec_phaseShiftByTerm</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="structComplex.html">Complex</a> term)</td></tr>
<tr class="separator:a8972669148af60d7e1c09687f69673d4"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5ef71ca3bb26774d7317253128a4aeab"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a5ef71ca3bb26774d7317253128a4aeab">statevec_phaseShiftByTermKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle)</td></tr>
<tr class="separator:a5ef71ca3bb26774d7317253128a4aeab"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1e57230c7995447039e62a84c0a36524"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">statevec_reportStateToScreen</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQuESTEnv.html">QuESTEnv</a> env, int reportRank)</td></tr>
<tr class="memdesc:a1e57230c7995447039e62a84c0a36524"><td class="mdescLeft"> </td><td class="mdescRight">Print the current state vector of probability amplitudes for a set of qubits to standard out. <a href="QuEST__gpu_8cu.html#a1e57230c7995447039e62a84c0a36524">More...</a><br /></td></tr>
<tr class="separator:a1e57230c7995447039e62a84c0a36524"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa121d55f2ca09c06a96ddcd433c60b0f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#aa121d55f2ca09c06a96ddcd433c60b0f">statevec_setAmps</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int startInd, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reals, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imags, long long int numAmps)</td></tr>
<tr class="separator:aa121d55f2ca09c06a96ddcd433c60b0f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad64a23933361fafc1b6b1787759c2663"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ad64a23933361fafc1b6b1787759c2663">statevec_setWeightedQureg</a> (<a class="el" href="structComplex.html">Complex</a> fac1, <a class="el" href="structQureg.html">Qureg</a> qureg1, <a class="el" href="structComplex.html">Complex</a> fac2, <a class="el" href="structQureg.html">Qureg</a> qureg2, <a class="el" href="structComplex.html">Complex</a> facOut, <a class="el" href="structQureg.html">Qureg</a> out)</td></tr>
<tr class="separator:ad64a23933361fafc1b6b1787759c2663"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a040a1c670457b4b5789c089a3d32bf8f"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a040a1c670457b4b5789c089a3d32bf8f">statevec_setWeightedQuregKernel</a> (<a class="el" href="structComplex.html">Complex</a> fac1, <a class="el" href="structQureg.html">Qureg</a> qureg1, <a class="el" href="structComplex.html">Complex</a> fac2, <a class="el" href="structQureg.html">Qureg</a> qureg2, <a class="el" href="structComplex.html">Complex</a> facOut, <a class="el" href="structQureg.html">Qureg</a> out)</td></tr>
<tr class="separator:a040a1c670457b4b5789c089a3d32bf8f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab7478fcaf6357ab202d72853b672e375"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab7478fcaf6357ab202d72853b672e375">statevec_swapQubitAmps</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qb1, int qb2)</td></tr>
<tr class="separator:ab7478fcaf6357ab202d72853b672e375"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a89a450a1932e4f4f94cf1487af9d263b"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a89a450a1932e4f4f94cf1487af9d263b">statevec_swapQubitAmpsKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qb1, int qb2)</td></tr>
<tr class="separator:a89a450a1932e4f4f94cf1487af9d263b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4bea7ed7967083cbabd8a8e5acdd48c0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a4bea7ed7967083cbabd8a8e5acdd48c0">statevec_unitary</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:a4bea7ed7967083cbabd8a8e5acdd48c0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab2ade4284b49f76631d51845ae54abdb"><td class="memItemLeft" align="right" valign="top">__global__ void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#ab2ade4284b49f76631d51845ae54abdb">statevec_unitaryKernel</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, const int targetQubit, ArgMatrix2 u)</td></tr>
<tr class="separator:ab2ade4284b49f76631d51845ae54abdb"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a31772904f024efd8d75a022e84c8207b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__gpu_8cu.html#a31772904f024efd8d75a022e84c8207b">swapDouble</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **a, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> **b)</td></tr>
<tr class="separator:a31772904f024efd8d75a022e84c8207b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a> (<a class="el" href="structQuESTEnv.html">QuESTEnv</a> env)</td></tr>
<tr class="memdesc:ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><td class="mdescLeft"> </td><td class="mdescRight">Guarantees that all code up to the given point has been executed on all nodes (if running in distributed mode) <a href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">More...</a><br /></td></tr>
<tr class="separator:ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:gac7e38d768a1bd79019f88cc1e6295092"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">syncQuESTSuccess</a> (int successCode)</td></tr>
<tr class="memdesc:gac7e38d768a1bd79019f88cc1e6295092"><td class="mdescLeft"> </td><td class="mdescRight">Performs a logical AND on all successCodes held by all processes. <a href="group__debug.html#gac7e38d768a1bd79019f88cc1e6295092">More...</a><br /></td></tr>
<tr class="separator:gac7e38d768a1bd79019f88cc1e6295092"><td class="memSeparator" colspan="2"> </td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>An implementation of the backend in ../QuEST_internal.h for a GPU environment.</p>
<dl class="section author"><dt>Author</dt><dd>Ania Brown </dd>
<dd>
Tyson Jones </dd></dl>
<p class="definition">Definition in file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
</div><h2 class="groupheader">Macro Definition Documentation</h2>
<a id="ad72dbcf6d0153db1b8d8a58001feed83"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad72dbcf6d0153db1b8d8a58001feed83">◆ </a></span>DEBUG</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define DEBUG   0</td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00020">20</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
</div>
</div>
<a id="aa57d77a0903e334e963c66ddc5ed3f53"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa57d77a0903e334e963c66ddc5ed3f53">◆ </a></span>REDUCE_SHARED_SIZE</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define REDUCE_SHARED_SIZE   512</td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00019">19</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a id="aea20d173141544e6c5359955a1fbe997"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aea20d173141544e6c5359955a1fbe997">◆ </a></span>copySharedReduceBlock()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void copySharedReduceBlock </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>arrayIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>length</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01751">1751</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>  <span class="keywordtype">int</span> blockOffset = blockIdx.x*length;</div>
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  tempReductionArray[threadIdx.x*2] = arrayIn[blockOffset + threadIdx.x*2];</div>
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  tempReductionArray[threadIdx.x*2+1] = arrayIn[blockOffset + threadIdx.x*2+1];</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  __syncthreads();</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, length);</div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l02194">densmatr_calcFidelity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02268">densmatr_calcHilbertSchmidtDistance()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01988">densmatr_calcInnerProduct()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02339">densmatr_calcPurity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01864">densmatr_findProbabilityOfZero()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02068">statevec_calcInnerProduct()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01912">statevec_findProbabilityOfZero()</a>.</p>
</div>
</div>
<a id="aa6c3f86010ad398f42b0577ea3bb5bcf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa6c3f86010ad398f42b0577ea3bb5bcf">◆ </a></span>densmatr_calcFidelity()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcFidelity </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>pureState</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02194">2194</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>  {</div>
<div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>  </div>
<div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02197"></a><span class="lineno"> 2197</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="l02198"></a><span class="lineno"> 2198</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce = densityDim;</div>
<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  </div>
<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02201"></a><span class="lineno"> 2201</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="l02202"></a><span class="lineno"> 2202</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  </div>
<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</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>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  }</div>
<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  }</div>
<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</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">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  <span class="comment">// store the reduction in the pureState array</span></div>
<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>  densmatr_calcFidelityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>  qureg, pureState, densityDim, pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>  firstTime = 0;</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">// sum the block probs</span></div>
<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>  pureState.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>  pureState.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02233"></a><span class="lineno"> 2233</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="l02234"></a><span class="lineno"> 2234</span>  }</div>
<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  </div>
<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  }</div>
<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  </div>
<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> fidelity;</div>
<div class="line"><a name="l02240"></a><span class="lineno"> 2240</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="l02241"></a><span class="lineno"> 2241</span>  <span class="keywordflow">return</span> fidelity;</div>
<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00861">calcFidelity()</a>.</p>
</div>
</div>
<a id="a090901670793c53a1b08629712b2cdae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a090901670793c53a1b08629712b2cdae">◆ </a></span>densmatr_calcFidelityKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcFidelityKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>dens</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>vec</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>dim</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes one term of (vec^*T) dens * vec </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02156">2156</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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"> 2158</span>  <span class="comment">// figure out which density matrix row to consider</span></div>
<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col;</div>
<div class="line"><a name="l02160"></a><span class="lineno"> 2160</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="l02161"></a><span class="lineno"> 2161</span>  <span class="keywordflow">if</span> (row >= dim) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  </div>
<div class="line"><a name="l02163"></a><span class="lineno"> 2163</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="l02164"></a><span class="lineno"> 2164</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="l02165"></a><span class="lineno"> 2165</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="l02166"></a><span class="lineno"> 2166</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="l02167"></a><span class="lineno"> 2167</span>  </div>
<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  <span class="comment">// compute the row-th element of the product dens*vec</span></div>
<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodReal = 0;</div>
<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prodImag = 0;</div>
<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>  <span class="keywordflow">for</span> (col=0LL; col < dim; col++) {</div>
<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemReal = densReal[dim*col + row];</div>
<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemImag = densImag[dim*col + row];</div>
<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>  </div>
<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>  prodReal += densElemReal*vecReal[col] - densElemImag*vecImag[col];</div>
<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  prodImag += densElemReal*vecImag[col] + densElemImag*vecReal[col];</div>
<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>  }</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">// multiply with row-th elem of (vec^*)</span></div>
<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> termReal = prodImag*vecImag[row] + prodReal*vecReal[row];</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="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="l02183"></a><span class="lineno"> 2183</span>  <span class="comment">//qreal termImag = prodImag*vecReal[row] - prodReal*vecImag[row];</span></div>
<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  </div>
<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>  tempReductionArray[threadIdx.x] = termReal;</div>
<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  __syncthreads();</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">// every second thread reduces</span></div>
<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="a8c9da88f734b0862f4cce7d819e6d3b5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8c9da88f734b0862f4cce7d819e6d3b5">◆ </a></span>densmatr_calcHilbertSchmidtDistance()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcHilbertSchmidtDistance </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02268">2268</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>  {</div>
<div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>  </div>
<div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>  <span class="comment">// we're summing the square of every term in (a-b)</span></div>
<div class="line"><a name="l02271"></a><span class="lineno"> 2271</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="l02272"></a><span class="lineno"> 2272</span>  </div>
<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02274"></a><span class="lineno"> 2274</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="l02275"></a><span class="lineno"> 2275</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  </div>
<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</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">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  }</div>
<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  }</div>
<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>  </div>
<div class="line"><a name="l02292"></a><span class="lineno"> 2292</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="l02293"></a><span class="lineno"> 2293</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>  densmatr_calcHilbertSchmidtDistanceSquaredKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02295"></a><span class="lineno"> 2295</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="l02296"></a><span class="lineno"> 2296</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="l02297"></a><span class="lineno"> 2297</span>  numValuesToReduce, a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  firstTime = 0;</div>
<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>  </div>
<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  a.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  a.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02307"></a><span class="lineno"> 2307</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="l02308"></a><span class="lineno"> 2308</span>  }</div>
<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  </div>
<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</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"> 2313</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace;</div>
<div class="line"><a name="l02314"></a><span class="lineno"> 2314</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="l02315"></a><span class="lineno"> 2315</span>  </div>
<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sqrtTrace = sqrt(trace);</div>
<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  <span class="keywordflow">return</span> sqrtTrace;</div>
<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00889">calcHilbertSchmidtDistance()</a>.</p>
</div>
</div>
<a id="a8e15b37c8dd7514a5480381699aa82c2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8e15b37c8dd7514a5480381699aa82c2">◆ </a></span>densmatr_calcHilbertSchmidtDistanceSquaredKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcHilbertSchmidtDistanceSquaredKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>aRe</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>aIm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>bRe</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>bIm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02244">2244</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  {</div>
<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  <span class="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02249"></a><span class="lineno"> 2249</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="l02250"></a><span class="lineno"> 2250</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  </div>
<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  <span class="comment">// compute this thread's sum term</span></div>
<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difRe = aRe[index] - bRe[index];</div>
<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difIm = aIm[index] - bIm[index];</div>
<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> term = difRe*difRe + difIm*difIm;</div>
<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  </div>
<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  <span class="comment">// array of each thread's collected term, to be summed</span></div>
<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  __syncthreads();</div>
<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  </div>
<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02265"></a><span class="lineno"> 2265</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="a6ff3dc624b5fafe8edae4fe327c255a0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6ff3dc624b5fafe8edae4fe327c255a0">◆ </a></span>densmatr_calcInnerProduct()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcInnerProduct </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01988">1988</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  {</div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  </div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</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="l01992"></a><span class="lineno"> 1992</span>  </div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</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="l01995"></a><span class="lineno"> 1995</span>  <span class="keywordtype">int</span> firstTime = 1;</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>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  </div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  }</div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  }</div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</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="comment">// spawn threads to sum the terms in each block</span></div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <span class="comment">// arbitrarily store the reduction in the b qureg's array</span></div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  densmatr_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  a, b, a.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>, b.firstLevelReduction);</div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  firstTime = 0;</div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>  } </div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  <span class="comment">// sum the block terms</span></div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>  b.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>  b.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02026"></a><span class="lineno"> 2026</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="l02027"></a><span class="lineno"> 2027</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>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  }</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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerprod;</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</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="l02034"></a><span class="lineno"> 2034</span>  <span class="keywordflow">return</span> innerprod;</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00172">Qureg::numAmpsTotal</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00837">calcDensityInnerProduct()</a>.</p>
</div>
</div>
<a id="a24d53b07592f424e5cc3dcd12f51bf32"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a24d53b07592f424e5cc3dcd12f51bf32">◆ </a></span>densmatr_calcInnerProductKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcInnerProductKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTermsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij), which is a real number </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01967">1967</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>  { </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> index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  </div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</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="l01974"></a><span class="lineno"> 1974</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prod = (</div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</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="l01976"></a><span class="lineno"> 1976</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="l01977"></a><span class="lineno"> 1977</span>  </div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  tempReductionArray[threadIdx.x] = prod;</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  __syncthreads();</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  </div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="ad405e3fac20997043e0236b751e44270"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad405e3fac20997043e0236b751e44270">◆ </a></span>densmatr_calcProbOfOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcProbOfOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01958">1958</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> {</div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc">densmatr_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  <span class="keywordflow">if</span> (outcome==1) </div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01864">densmatr_findProbabilityOfZero()</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00845">calcProbOfOutcome()</a>, <a class="el" href="QuEST_8c_source.html#l00724">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00368">densmatr_measureWithStats()</a>.</p>
</div>
</div>
<a id="ae45eefa65f4ecd37bab84fade7cf7f1f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae45eefa65f4ecd37bab84fade7cf7f1f">◆ </a></span>densmatr_calcPurity()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcPurity </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Computes the trace of the density matrix squared. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02339">2339</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  {</div>
<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  </div>
<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  <span class="comment">// we're summing the square of every term in the density matrix</span></div>
<div class="line"><a name="l02342"></a><span class="lineno"> 2342</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="l02343"></a><span class="lineno"> 2343</span>  </div>
<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02345"></a><span class="lineno"> 2345</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="l02346"></a><span class="lineno"> 2346</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  </div>
<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  </div>
<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  <span class="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  }</div>
<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>  }</div>
<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>  <span class="comment">// dictates size of reduction array</span></div>
<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>  </div>
<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  densmatr_calcPurityKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02366"></a><span class="lineno"> 2366</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="l02367"></a><span class="lineno"> 2367</span>  numValuesToReduce, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>  firstTime = 0;</div>
<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  </div>
<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02377"></a><span class="lineno"> 2377</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="l02378"></a><span class="lineno"> 2378</span>  }</div>
<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  </div>
<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  }</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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> traceDensSquared;</div>
<div class="line"><a name="l02384"></a><span class="lineno"> 2384</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="l02385"></a><span class="lineno"> 2385</span>  <span class="keywordflow">return</span> traceDensSquared;</div>
<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00855">calcPurity()</a>.</p>
</div>
</div>
<a id="afe005f9f69319901bb56c4d022359ad5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afe005f9f69319901bb56c4d022359ad5">◆ </a></span>densmatr_calcPurityKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_calcPurityKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02320">2320</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>  {</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="comment">// figure out which density matrix term this thread is assigned</span></div>
<div class="line"><a name="l02323"></a><span class="lineno"> 2323</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="l02324"></a><span class="lineno"> 2324</span>  <span class="keywordflow">if</span> (index >= numAmpsToSum) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  </div>
<div class="line"><a name="l02326"></a><span class="lineno"> 2326</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="l02327"></a><span class="lineno"> 2327</span>  </div>
<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  tempReductionArray[threadIdx.x] = term;</div>
<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  __syncthreads();</div>
<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  </div>
<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02336"></a><span class="lineno"> 2336</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="a6153547f245c05874161a105e9a2f02c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6153547f245c05874161a105e9a2f02c">◆ </a></span>densmatr_calcTotalProb()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcTotalProb </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01476">1476</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  {</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>  <span class="comment">// computes the trace using Kahan summation</span></div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  c = 0;</div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  </div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</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="l01484"></a><span class="lineno"> 1484</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> diagIndex;</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  </div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  </div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> col=0; col< numCols; col++) {</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  diagIndex = col*(numCols + 1);</div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  y = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[diagIndex] - c;</div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  t = pTotal + y;</div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  c = ( t - pTotal ) - y; <span class="comment">// brackets are important</span></div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  pTotal = t;</div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  }</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="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00407">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00822">calcTotalProb()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00464">statevec_calcExpecPauliProd()</a>.</p>
</div>
</div>
<a id="ab321af37fe3490253e12b7c70b8d2a98"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab321af37fe3490253e12b7c70b8d2a98">◆ </a></span>densmatr_collapseToKnownProbOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_collapseToKnownProbOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>outcomeProb</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This involves finding |...i...><...j...| states and killing those where i!=j. </p>
<p>Renorms (/prob) every | * outcome * >< * outcome * | state, setting all others to zero. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02480">2480</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>  {</div>
<div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>  </div>
<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  <span class="keywordtype">int</span> rowQubit = measureQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  </div>
<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  <span class="keywordtype">int</span> colBit = 1LL << measureQubit;</div>
<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <span class="keywordtype">int</span> rowBit = 1LL << rowQubit;</div>
<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  </div>
<div class="line"><a name="l02487"></a><span class="lineno"> 2487</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="l02488"></a><span class="lineno"> 2488</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="l02489"></a><span class="lineno"> 2489</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="l02490"></a><span class="lineno"> 2490</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="l02491"></a><span class="lineno"> 2491</span>  </div>
<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> desired, undesired;</div>
<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  <span class="keywordflow">if</span> (outcome == 0) {</div>
<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  desired = 0;</div>
<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  undesired = colBit | rowBit;</div>
<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>  desired = colBit | rowBit;</div>
<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>  undesired = 0;</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>  </div>
<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>  CUDABlocks = ceil(numBasesToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  densmatr_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02505"></a><span class="lineno"> 2505</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="l02506"></a><span class="lineno"> 2506</span>  part1, part2, part3, rowBit, colBit, desired, undesired);</div>
<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00724">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00368">densmatr_measureWithStats()</a>.</p>
</div>
</div>
<a id="afc4dcedaf429d823f4da83d3521d8293"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afc4dcedaf429d823f4da83d3521d8293">◆ </a></span>densmatr_collapseToKnownProbOutcomeKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_collapseToKnownProbOutcomeKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>outcomeProb</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numBasesToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>desired</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>undesired</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Maps thread ID to a |..0..><..0..| state and then locates |0><1|, |1><0| and |1><1|. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02454">2454</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span> {</div>
<div class="line"><a name="l02459"></a><span class="lineno"> 2459</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="l02460"></a><span class="lineno"> 2460</span>  <span class="keywordflow">if</span> (scanInd >= numBasesToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  </div>
<div class="line"><a name="l02462"></a><span class="lineno"> 2462</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="l02463"></a><span class="lineno"> 2463</span>  </div>
<div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>  <span class="comment">// renormalise desired outcome</span></div>
<div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>  vecReal[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>  vecImag[base + desired] /= outcomeProb;</div>
<div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>  </div>
<div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>  <span class="comment">// kill undesired outcome</span></div>
<div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>  vecReal[base + undesired] = 0;</div>
<div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>  vecImag[base + undesired] = 0;</div>
<div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>  </div>
<div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>  <span class="comment">// kill |..0..><..1..| states</span></div>
<div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>  vecReal[base + colBit] = 0;</div>
<div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>  vecImag[base + colBit] = 0;</div>
<div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>  vecReal[base + rowBit] = 0;</div>
<div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>  vecImag[base + rowBit] = 0;</div>
<div class="line"><a name="l02477"></a><span class="lineno"> 2477</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="afbb044d76bf22d5c81a2a70a977f29bc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afbb044d76bf22d5c81a2a70a977f29bc">◆ </a></span>densmatr_findProbabilityOfZero()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_findProbabilityOfZero </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01864">1864</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span> {</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</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="l01867"></a><span class="lineno"> 1867</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="l01868"></a><span class="lineno"> 1868</span>  </div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</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="l01871"></a><span class="lineno"> 1871</span>  <span class="keywordtype">int</span> firstTime = 1;</div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  </div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</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="comment">// need less than one CUDA-BLOCK to reduce</span></div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  numCUDABlocks = 1;</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>  <span class="comment">// otherwise use only full CUDA-BLOCKS</span></div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  valuesPerCUDABlock = maxReducedPerLevel; <span class="comment">// constrained by shared memory</span></div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  }</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>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  </div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  <span class="comment">// spawn threads to sum the probs in each block</span></div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  densmatr_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  firstTime = 0;</div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  </div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  <span class="comment">// sum the block probs</span></div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</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="l01902"></a><span class="lineno"> 1902</span>  }</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  </div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  }</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>  </div>
<div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> zeroProb;</div>
<div class="line"><a name="l01908"></a><span class="lineno"> 1908</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="l01909"></a><span class="lineno"> 1909</span>  <span class="keywordflow">return</span> zeroProb;</div>
<div class="line"><a name="l01910"></a><span class="lineno"> 1910</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01958">densmatr_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="a3414d9307ecfd0caa2be560a00eb7c61"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3414d9307ecfd0caa2be560a00eb7c61">◆ </a></span>densmatr_findProbabilityOfZeroKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_findProbabilityOfZeroKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01760">1760</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  {</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  <span class="comment">// run by each thread</span></div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="comment">// use of block here refers to contiguous amplitudes where measureQubit = 0, </span></div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</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="l01766"></a><span class="lineno"> 1766</span>  </div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</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="l01768"></a><span class="lineno"> 1768</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="l01769"></a><span class="lineno"> 1769</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="l01770"></a><span class="lineno"> 1770</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="l01771"></a><span class="lineno"> 1771</span>  </div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</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="l01773"></a><span class="lineno"> 1773</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="l01774"></a><span class="lineno"> 1774</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="l01775"></a><span class="lineno"> 1775</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="l01776"></a><span class="lineno"> 1776</span>  </div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>  <span class="comment">// array of each thread's collected probability, to be summed</span></div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>  </div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  <span class="comment">// figure out which density matrix prob that this thread is assigned</span></div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  basisIndex = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  densityIndex = (densityDim + 1) * basisIndex;</div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  </div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="comment">// record the probability in the CUDA-BLOCK-wide array</span></div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</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="l01789"></a><span class="lineno"> 1789</span>  tempReductionArray[threadIdx.x] = prob;</div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  </div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</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="l01792"></a><span class="lineno"> 1792</span>  __syncthreads();</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  }</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="a20a155f53efc45c16803d7539c2c199d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a20a155f53efc45c16803d7539c2c199d">◆ </a></span>densmatr_initClassicalState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initClassicalState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00258">258</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00132">initClassicalState()</a>.</p>
</div>
</div>
<a id="a9f4bb112d5e95abb8e35bf051a02a06e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9f4bb112d5e95abb8e35bf051a02a06e">◆ </a></span>densmatr_initClassicalStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_initClassicalStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>densityNumElems</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>densityReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>densityImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>densityInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00239">239</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
</div>
</div>
<a id="ad5b2ac0b00afa495f385520b2c5fa839"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad5b2ac0b00afa495f385520b2c5fa839">◆ </a></span>densmatr_initPlusState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initPlusState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00226">226</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00123">initPlusState()</a>.</p>
</div>
</div>
<a id="a4cf98d55602d1138a2101c158095afdc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4cf98d55602d1138a2101c158095afdc">◆ </a></span>densmatr_initPlusStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_initPlusStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>probFactor</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00216">216</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  {</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><!-- fragment -->
</div>
</div>
<a id="ae5ad68d054875913d0f7ec654840a9ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae5ad68d054875913d0f7ec654840a9ec">◆ </a></span>densmatr_initPureState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initPureState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>targetQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>copyQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00205">205</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00143">initPureState()</a>.</p>
</div>
</div>
<a id="a664339e2afc50b0418a56adfc1bc512e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a664339e2afc50b0418a56adfc1bc512e">◆ </a></span>densmatr_initPureStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_initPureStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numPureAmps</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>targetVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>targetVecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>copyVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>copyVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00186">186</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a72b26b971531dbdc64de20501f368545"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a72b26b971531dbdc64de20501f368545">◆ </a></span>densmatr_mixDamping()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDamping </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>damping</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02723">2723</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>  {</div>
<div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  </div>
<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  <span class="keywordflow">if</span> (damping == 0)</div>
<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  <span class="keywordflow">return</span>;</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>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase = sqrt(1-damping);</div>
<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>  <a class="code" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephase);</div>
<div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>  </div>
<div class="line"><a name="l02731"></a><span class="lineno"> 2731</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="l02732"></a><span class="lineno"> 2732</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>  </div>
<div class="line"><a name="l02734"></a><span class="lineno"> 2734</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="l02735"></a><span class="lineno"> 2735</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="l02736"></a><span class="lineno"> 2736</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="l02737"></a><span class="lineno"> 2737</span>  </div>
<div class="line"><a name="l02738"></a><span class="lineno"> 2738</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="l02739"></a><span class="lineno"> 2739</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="l02740"></a><span class="lineno"> 2740</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="l02741"></a><span class="lineno"> 2741</span>  </div>
<div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>  densmatr_mixDampingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02746"></a><span class="lineno"> 2746</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="l02747"></a><span class="lineno"> 2747</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02554">densmatr_oneQubitDegradeOffDiagonal()</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00935">mixDamping()</a>.</p>
</div>
</div>
<a id="a7e0a6e9de648b33168d7f56eba53aa7b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7e0a6e9de648b33168d7f56eba53aa7b">◆ </a></span>densmatr_mixDampingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDampingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>damping</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>bothBits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Works like mixDephasing but modifies every other element, and elements are averaged in pairs. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02676">2676</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span> {</div>
<div class="line"><a name="l02681"></a><span class="lineno"> 2681</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="l02682"></a><span class="lineno"> 2682</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  </div>
<div class="line"><a name="l02684"></a><span class="lineno"> 2684</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="l02685"></a><span class="lineno"> 2685</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="l02686"></a><span class="lineno"> 2686</span>  </div>
<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = damping * ( vecReal[targetInd]);</div>
<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = damping * ( vecImag[targetInd]);</div>
<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  </div>
<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  vecReal[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  vecImag[targetInd] *= 1 - damping;</div>
<div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  </div>
<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a8adaba9dbdad6f7ab41ae4b8db0abefe"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8adaba9dbdad6f7ab41ae4b8db0abefe">◆ </a></span>densmatr_mixDensityMatrix()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDensityMatrix </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>combineQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>otherProb</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>otherQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02521">2521</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  {</div>
<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  </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> numAmpsToVisit = combineQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</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> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>  densmatr_mixDensityMatrixKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>  combineQureg, otherProb, otherQureg, numAmpsToVisit</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00770">mixDensityMatrix()</a>.</p>
</div>
</div>
<a id="a7f1cf14dd4820a59eb8a9874c2062bef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7f1cf14dd4820a59eb8a9874c2062bef">◆ </a></span>densmatr_mixDensityMatrixKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDensityMatrixKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>combineQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>otherProb</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>otherQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02509">2509</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l02511"></a><span class="lineno"> 2511</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="l02512"></a><span class="lineno"> 2512</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</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>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  combineQureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[ampInd] *= 1-otherProb;</div>
<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  </div>
<div class="line"><a name="l02517"></a><span class="lineno"> 2517</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="l02518"></a><span class="lineno"> 2518</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="l02519"></a><span class="lineno"> 2519</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>.</p>
</div>
</div>
<a id="a515b6a920b1715d4eae25dcf29f39b95"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a515b6a920b1715d4eae25dcf29f39b95">◆ </a></span>densmatr_mixDephasing()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDephasing </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>dephase</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02574">2574</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>  {</div>
<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  </div>
<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  </div>
<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</div>
<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  <a class="code" href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephFac);</div>
<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02554">densmatr_oneQubitDegradeOffDiagonal()</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l02697">densmatr_mixDepolarising()</a>, and <a class="el" href="QuEST_8c_source.html#l00902">mixDephasing()</a>.</p>
</div>
</div>
<a id="a37c6a59b2dd008d235474cb7248df952"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a37c6a59b2dd008d235474cb7248df952">◆ </a></span>densmatr_mixDephasingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDephasingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>fac</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called once for every 4 amplitudes in density matrix Works by establishing the |..0..><..0..| state (for its given index) then visiting |..1..><..0..| and |..0..><..1..|. </p>
<p>Labels |part1 X pa><rt2 NOT(X) part3| From the brain of Simon Benjamin </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02538">2538</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span> {</div>
<div class="line"><a name="l02543"></a><span class="lineno"> 2543</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="l02544"></a><span class="lineno"> 2544</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>  </div>
<div class="line"><a name="l02546"></a><span class="lineno"> 2546</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="l02547"></a><span class="lineno"> 2547</span>  vecReal[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>  vecImag[ampInd + colBit] *= fac;</div>
<div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>  vecReal[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>  vecImag[ampInd + rowBit] *= fac;</div>
<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a3765e92c79d4c2a0df6761a0e7da2676"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3765e92c79d4c2a0df6761a0e7da2676">◆ </a></span>densmatr_mixDepolarising()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDepolarising </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02697">2697</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  {</div>
<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  </div>
<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>  </div>
<div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>  <a class="code" href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95">densmatr_mixDephasing</a>(qureg, targetQubit, depolLevel);</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>  <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="l02705"></a><span class="lineno"> 2705</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</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>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colBit = 1LL << targetQubit;</div>
<div class="line"><a name="l02708"></a><span class="lineno"> 2708</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="l02709"></a><span class="lineno"> 2709</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="l02710"></a><span class="lineno"> 2710</span>  </div>
<div class="line"><a name="l02711"></a><span class="lineno"> 2711</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="l02712"></a><span class="lineno"> 2712</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="l02713"></a><span class="lineno"> 2713</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="l02714"></a><span class="lineno"> 2714</span>  </div>
<div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  densmatr_mixDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02719"></a><span class="lineno"> 2719</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="l02720"></a><span class="lineno"> 2720</span>  part1, part2, part3, bothBits);</div>
<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02574">densmatr_mixDephasing()</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00924">mixDepolarising()</a>.</p>
</div>
</div>
<a id="aeb0039eccca94ba644a8728d91eff5bb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aeb0039eccca94ba644a8728d91eff5bb">◆ </a></span>densmatr_mixDepolarisingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixDepolarisingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>bothBits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Works like mixDephasing but modifies every other element, and elements are averaged in pairs. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02650">2650</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span> {</div>
<div class="line"><a name="l02655"></a><span class="lineno"> 2655</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="l02656"></a><span class="lineno"> 2656</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</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="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="l02659"></a><span class="lineno"> 2659</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="l02660"></a><span class="lineno"> 2660</span>  </div>
<div class="line"><a name="l02661"></a><span class="lineno"> 2661</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="l02662"></a><span class="lineno"> 2662</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="l02663"></a><span class="lineno"> 2663</span>  </div>
<div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>  vecReal[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>  vecImag[baseInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>  vecReal[targetInd] *= 1 - depolLevel;</div>
<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>  vecImag[targetInd] *= 1 - depolLevel;</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>  vecReal[baseInd] += realAvDepol;</div>
<div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>  vecImag[baseInd] += imagAvDepol;</div>
<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>  vecReal[targetInd] += realAvDepol;</div>
<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  vecImag[targetInd] += imagAvDepol;</div>
<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a623e577b7230f3c8dc202be6185b4289"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a623e577b7230f3c8dc202be6185b4289">◆ </a></span>densmatr_mixTwoQubitDephasing()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDephasing </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>dephase</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02613">2613</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>  <span class="keywordflow">if</span> (dephase == 0)</div>
<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  </div>
<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>  </div>
<div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  </div>
<div class="line"><a name="l02623"></a><span class="lineno"> 2623</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="l02624"></a><span class="lineno"> 2624</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="l02625"></a><span class="lineno"> 2625</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="l02626"></a><span class="lineno"> 2626</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="l02627"></a><span class="lineno"> 2627</span>  </div>
<div class="line"><a name="l02628"></a><span class="lineno"> 2628</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="l02629"></a><span class="lineno"> 2629</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="l02630"></a><span class="lineno"> 2630</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="l02631"></a><span class="lineno"> 2631</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="l02632"></a><span class="lineno"> 2632</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="l02633"></a><span class="lineno"> 2633</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephFac = 1 - dephase;</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>  <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="l02636"></a><span class="lineno"> 2636</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="l02637"></a><span class="lineno"> 2637</span>  </div>
<div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>  <span class="comment">// 12 of these states experience dephasing</span></div>
<div class="line"><a name="l02639"></a><span class="lineno"> 2639</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="l02640"></a><span class="lineno"> 2640</span>  </div>
<div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>  densmatr_mixTwoQubitDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02645"></a><span class="lineno"> 2645</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="l02646"></a><span class="lineno"> 2646</span>  part1, part2, part3, part4, part5, colBit1, rowBit1, colBit2, rowBit2);</div>
<div class="line"><a name="l02647"></a><span class="lineno"> 2647</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00754">densmatr_mixTwoQubitDepolarising()</a>, and <a class="el" href="QuEST_8c_source.html#l00912">mixTwoQubitDephasing()</a>.</p>
</div>
</div>
<a id="ad27d13bcdcbe777e139a90c2e8d52924"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad27d13bcdcbe777e139a90c2e8d52924">◆ </a></span>densmatr_mixTwoQubitDephasingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixTwoQubitDephasingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>fac</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numBackgroundStates</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part4</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part5</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>colBit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowBit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called 12 times for every 16 amplitudes in density matrix Each sums from the |..0..0..><..0..0..| index to visit either |..0..0..><..0..1..|, |..0..0..><..1..0..|, |..0..0..><..1..1..|, |..0..1..><..0..0..| etc and so on to |..1..1..><..1..0|. </p>
<p>Labels |part1 0 part2 0 par><t3 0 part4 0 part5|. From the brain of Simon Benjamin </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02589">2589</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span> {</div>
<div class="line"><a name="l02594"></a><span class="lineno"> 2594</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="l02595"></a><span class="lineno"> 2595</span>  <span class="keywordflow">if</span> (outerInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  </div>
<div class="line"><a name="l02597"></a><span class="lineno"> 2597</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="l02598"></a><span class="lineno"> 2598</span>  <span class="keywordtype">int</span> meta = 1 + (outerInd/numBackgroundStates);</div>
<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <span class="keywordflow">if</span> (meta > 4) meta++;</div>
<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="keywordflow">if</span> (meta > 9) meta++;</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="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="l02603"></a><span class="lineno"> 2603</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="l02604"></a><span class="lineno"> 2604</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd = (</div>
<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  shift + </div>
<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  (scanInd&part1) + ((scanInd&part2)<<1) + ((scanInd&part3)<<2) + ((scanInd&part4)<<3) + ((scanInd&part5)<<4));</div>
<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  </div>
<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  vecReal[stateInd] *= fac;</div>
<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  vecImag[stateInd] *= fac;</div>
<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a43afa97e300b87bce7f3eb1213eb05f6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a43afa97e300b87bce7f3eb1213eb05f6">◆ </a></span>densmatr_mixTwoQubitDepolarising()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDepolarising </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02783">2783</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  <span class="keywordflow">if</span> (depolLevel == 0)</div>
<div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  </div>
<div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  <span class="comment">// assumes qubit2 > qubit1</span></div>
<div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>  </div>
<div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>  <a class="code" href="QuEST__gpu_8cu.html#a623e577b7230f3c8dc202be6185b4289">densmatr_mixTwoQubitDephasing</a>(qureg, qubit1, qubit2, depolLevel);</div>
<div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>  </div>
<div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>  <span class="keywordtype">int</span> rowQubit1 = qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>  <span class="keywordtype">int</span> rowQubit2 = qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>  </div>
<div class="line"><a name="l02795"></a><span class="lineno"> 2795</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="l02796"></a><span class="lineno"> 2796</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="l02797"></a><span class="lineno"> 2797</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="l02798"></a><span class="lineno"> 2798</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="l02799"></a><span class="lineno"> 2799</span>  </div>
<div class="line"><a name="l02800"></a><span class="lineno"> 2800</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="l02801"></a><span class="lineno"> 2801</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="l02802"></a><span class="lineno"> 2802</span>  </div>
<div class="line"><a name="l02803"></a><span class="lineno"> 2803</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="l02804"></a><span class="lineno"> 2804</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="l02805"></a><span class="lineno"> 2805</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="l02806"></a><span class="lineno"> 2806</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="l02807"></a><span class="lineno"> 2807</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="l02808"></a><span class="lineno"> 2808</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="l02809"></a><span class="lineno"> 2809</span>  </div>
<div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  densmatr_mixTwoQubitDepolarisingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02814"></a><span class="lineno"> 2814</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="l02815"></a><span class="lineno"> 2815</span>  part1, part2, part3, part4, part5, rowCol1, rowCol2);</div>
<div class="line"><a name="l02816"></a><span class="lineno"> 2816</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l02613">densmatr_mixTwoQubitDephasing()</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00943">mixTwoQubitDepolarising()</a>.</p>
</div>
</div>
<a id="a5f96311d9094c382074ad70d4b789612"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5f96311d9094c382074ad70d4b789612">◆ </a></span>densmatr_mixTwoQubitDepolarisingKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void densmatr_mixTwoQubitDepolarisingKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmpsToVisit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part4</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>part5</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowCol1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>rowCol2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called once for every 16 amplitudes. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02751">2751</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span> {</div>
<div class="line"><a name="l02757"></a><span class="lineno"> 2757</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="l02758"></a><span class="lineno"> 2758</span>  <span class="keywordflow">if</span> (scanInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>  </div>
<div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>  <span class="comment">// index of |..0..0..><..0..0|</span></div>
<div class="line"><a name="l02761"></a><span class="lineno"> 2761</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="l02762"></a><span class="lineno"> 2762</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="l02763"></a><span class="lineno"> 2763</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="l02764"></a><span class="lineno"> 2764</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="l02765"></a><span class="lineno"> 2765</span>  </div>
<div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>  vecReal[ind00] + vecReal[ind01] + vecReal[ind10] + vecReal[ind11]);</div>
<div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imagAvDepol = depolLevel * 0.25 * (</div>
<div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>  vecImag[ind00] + vecImag[ind01] + vecImag[ind10] + vecImag[ind11]);</div>
<div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  </div>
<div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain = 1 - depolLevel;</div>
<div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  vecReal[ind00] *= retain; vecImag[ind00] *= retain;</div>
<div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  vecReal[ind01] *= retain; vecImag[ind01] *= retain;</div>
<div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>  vecReal[ind10] *= retain; vecImag[ind10] *= retain;</div>
<div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  vecReal[ind11] *= retain; vecImag[ind11] *= retain;</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>  vecReal[ind00] += realAvDepol; vecImag[ind00] += imagAvDepol;</div>
<div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>  vecReal[ind01] += realAvDepol; vecImag[ind01] += imagAvDepol;</div>
<div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>  vecReal[ind10] += realAvDepol; vecImag[ind10] += imagAvDepol;</div>
<div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  vecReal[ind11] += realAvDepol; vecImag[ind11] += imagAvDepol;</div>
<div class="line"><a name="l02781"></a><span class="lineno"> 2781</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a303c00c3329a7bf290b68468735b4a8f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a303c00c3329a7bf290b68468735b4a8f">◆ </a></span>densmatr_oneQubitDegradeOffDiagonal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_oneQubitDegradeOffDiagonal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>dephFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02554">2554</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  {</div>
<div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  </div>
<div class="line"><a name="l02556"></a><span class="lineno"> 2556</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="l02557"></a><span class="lineno"> 2557</span>  </div>
<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  <span class="keywordtype">int</span> rowQubit = targetQubit + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l02559"></a><span class="lineno"> 2559</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="l02560"></a><span class="lineno"> 2560</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="l02561"></a><span class="lineno"> 2561</span>  </div>
<div class="line"><a name="l02562"></a><span class="lineno"> 2562</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="l02563"></a><span class="lineno"> 2563</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="l02564"></a><span class="lineno"> 2564</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="l02565"></a><span class="lineno"> 2565</span>  </div>
<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>  densmatr_mixDephasingKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02570"></a><span class="lineno"> 2570</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="l02571"></a><span class="lineno"> 2571</span>  part1, part2, part3, colBit, rowBit);</div>
<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00165">Qureg::numQubitsRepresented</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l02723">densmatr_mixDamping()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l02574">densmatr_mixDephasing()</a>.</p>
</div>
</div>
<a id="a5cb8662afc6c644a46f7339c89bfd226"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5cb8662afc6c644a46f7339c89bfd226">◆ </a></span>extractBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ int extractBit </td>
<td>(</td>
<td class="paramtype">int </td>
<td class="paramname"><em>locationOfBitFromRight</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>theEncodedNumber</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00082">82</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00545">compressPairVectorForSingleQubitDepolarise()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00611">compressPairVectorForTwoQubitDepolarise()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00784">densmatr_collapseToKnownProbOutcome()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03111">densmatr_findProbabilityOfZeroLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00299">densmatr_mixDampingDistributed()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00224">densmatr_mixDepolarisingDistributed()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00540">densmatr_mixTwoQubitDepolarisingDistributed()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00631">densmatr_mixTwoQubitDepolarisingQ1LocalQ2DistributedPart3()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01338">getGlobalIndOfOddParityInChunk()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02285">statevec_controlledCompactUnitaryDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00730">statevec_controlledCompactUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02069">statevec_controlledCompactUnitaryLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02612">statevec_controlledNotDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01678">statevec_controlledNotKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02550">statevec_controlledNotLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02793">statevec_controlledPauliYDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01287">statevec_controlledPauliYKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02740">statevec_controlledPauliYLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03260">statevec_controlledPhaseFlip()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01531">statevec_controlledPhaseFlipKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02980">statevec_controlledPhaseShift()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01380">statevec_controlledPhaseShiftKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02347">statevec_controlledUnitaryDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01057">statevec_controlledUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l02207">statevec_controlledUnitaryLocal()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01513">statevec_initStateOfSingleQubit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00578">statevec_initStateOfSingleQubitKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00858">statevec_multiControlledMultiQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01814">statevec_multiControlledMultiQubitUnitaryLocal()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l02940">statevec_phaseShiftByTerm()</a>.</p>
</div>
</div>
<a id="a6aea6cf9c06d05a5765ad01311531627"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6aea6cf9c06d05a5765ad01311531627">◆ </a></span>flipBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int flipBit </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>bitInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00095">95</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01338">getGlobalIndOfOddParityInChunk()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01441">statevec_multiControlledMultiQubitUnitary()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00858">statevec_multiControlledMultiQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01814">statevec_multiControlledMultiQubitUnitaryLocal()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01385">statevec_multiControlledTwoQubitUnitary()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00974">statevec_multiControlledTwoQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01715">statevec_multiControlledTwoQubitUnitaryLocal()</a>, <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01358">statevec_swapQubitAmps()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l03539">statevec_swapQubitAmpsDistributed()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01587">statevec_swapQubitAmpsKernel()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l03496">statevec_swapQubitAmpsLocal()</a>.</p>
</div>
</div>
<a id="a1775b7abce55ccfd036bd5f55707877c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1775b7abce55ccfd036bd5f55707877c">◆ </a></span>getBitMaskParity()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ int getBitMaskParity </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00086">86</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01449">statevec_multiRotateZKernel()</a>.</p>
</div>
</div>
<a id="a112c74b3365bda6697813d9931b55377"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a112c74b3365bda6697813d9931b55377">◆ </a></span>getNumReductionLevels()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int getNumReductionLevels </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numValuesToReduce</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numReducedPerLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01848">1848</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  {</div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  <span class="keywordtype">int</span> levels=0;</div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  <span class="keywordflow">while</span> (numValuesToReduce){</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  numValuesToReduce = numValuesToReduce/numReducedPerLevel;</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  levels++;</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>  <span class="keywordflow">return</span> levels;</div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a0aabd5ed69a74e5bc0b46a17af45c886"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0aabd5ed69a74e5bc0b46a17af45c886">◆ </a></span>GPUExists()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int GPUExists </td>
<td>(</td>
<td class="paramtype">void </td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00336">336</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">int</span> deviceCount, device;</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordtype">int</span> gpuDeviceCount = 0;</div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keyword">struct </span>cudaDeviceProp properties;</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  cudaError_t cudaResultCode = cudaGetDeviceCount(&deviceCount);</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">if</span> (cudaResultCode != cudaSuccess) deviceCount = 0;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="comment">/* machines with no GPUs can still report one emulation device */</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">for</span> (device = 0; device < deviceCount; ++device) {</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  cudaGetDeviceProperties(&properties, device);</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">if</span> (properties.major != 9999) { <span class="comment">/* 9999 means emulation only */</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  ++gpuDeviceCount;</div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  }</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  }</div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">if</span> (gpuDeviceCount) <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keywordflow">else</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00353">createQuESTEnv()</a>.</p>
</div>
</div>
<a id="a60b4893613de0cd6595f60cdec24999a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a60b4893613de0cd6595f60cdec24999a">◆ </a></span>insertTwoZeroBits()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int insertTwoZeroBits </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>bit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>bit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00106">106</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  {</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#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a>(<a class="code" href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a>(number, small), big);</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00099">insertZeroBit()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00974">statevec_multiControlledTwoQubitUnitaryKernel()</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01715">statevec_multiControlledTwoQubitUnitaryLocal()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01587">statevec_swapQubitAmpsKernel()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l03496">statevec_swapQubitAmpsLocal()</a>.</p>
</div>
</div>
<a id="a4536acc227ff24e63aaf47b2b42e765f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4536acc227ff24e63aaf47b2b42e765f">◆ </a></span>insertZeroBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int insertZeroBit </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00099">99</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  {</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><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00112">insertZeroBits()</a>, and <a class="el" href="QuEST__cpu_8c_source.html#l01814">statevec_multiControlledMultiQubitUnitaryLocal()</a>.</p>
</div>
</div>
<a id="a5f14823d1125e973c4b350bd6ac84552"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5f14823d1125e973c4b350bd6ac84552">◆ </a></span>insertZeroBits()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__forceinline__ __device__ long long int insertZeroBits </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>inds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numInds</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00112">112</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  {</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#a4536acc227ff24e63aaf47b2b42e765f">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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00099">insertZeroBit()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l00858">statevec_multiControlledMultiQubitUnitaryKernel()</a>.</p>
</div>
</div>
<a id="a8ce1e311ea72b862a8757dc71082fbf3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8ce1e311ea72b862a8757dc71082fbf3">◆ </a></span>log2Int()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__device__ __host__ unsigned int log2Int </td>
<td>(</td>
<td class="paramtype">unsigned int </td>
<td class="paramname"><em>x</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01725">1725</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> {</div>
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ans = 0 ;</div>
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <span class="keywordflow">while</span>( x>>=1 ) ans++;</div>
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  <span class="keywordflow">return</span> ans ;</div>
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="ac82f3dbf68f877f57d4abbb72fae1254"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac82f3dbf68f877f57d4abbb72fae1254">◆ </a></span>reduceBlock()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__device__ void reduceBlock </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>arrayIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>length</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01732">1732</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">int</span> i, l, r;</div>
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>  <span class="keywordtype">int</span> threadMax, maxDepth;</div>
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  threadMax = length/2;</div>
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  maxDepth = <a class="code" href="QuEST__gpu_8cu.html#a8ce1e311ea72b862a8757dc71082fbf3">log2Int</a>(length/2);</div>
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  </div>
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  <span class="keywordflow">for</span> (i=0; i<maxDepth+1; i++){</div>
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  <span class="keywordflow">if</span> (threadIdx.x<threadMax){</div>
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  l = threadIdx.x;</div>
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>  r = l + threadMax;</div>
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  arrayIn[l] = arrayIn[r] + arrayIn[l];</div>
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  }</div>
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  threadMax = threadMax >> 1;</div>
<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  __syncthreads(); <span class="comment">// optimise -- use warp shuffle instead</span></div>
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  }</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="keywordflow">if</span> (threadIdx.x==0) reducedArray[blockIdx.x] = arrayIn[0];</div>
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01725">log2Int()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02156">densmatr_calcFidelityKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02244">densmatr_calcHilbertSchmidtDistanceSquaredKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01967">densmatr_calcInnerProductKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02320">densmatr_calcPurityKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01760">densmatr_findProbabilityOfZeroKernel()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02038">statevec_calcInnerProductKernel()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01798">statevec_findProbabilityOfZeroKernel()</a>.</p>
</div>
</div>
<a id="a7ebd3198a198f4cd20840f64fd8b84d0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7ebd3198a198f4cd20840f64fd8b84d0">◆ </a></span>statevec_calcInnerProduct()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> statevec_calcInnerProduct </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>bra</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>ket</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Terrible code which unnecessarily individually computes and sums the real and imaginary components of the inner product, so as to not have to worry about keeping the sums separated during reduction. </p>
<p>Truly disgusting, probably doubles runtime, please fix. @TODO could even do the kernel twice, storing real in bra.reduc and imag in ket.reduc? </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02068">2068</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdReal, innerProdImag;</div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  </div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  <span class="keywordtype">int</span> getRealComp;</div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numValuesToReduce;</div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  <span class="keywordtype">int</span> maxReducedPerLevel;</div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  <span class="keywordtype">int</span> firstTime;</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  </div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  <span class="comment">// compute real component of inner product</span></div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  getRealComp = 1;</div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>  firstTime = 1;</div>
<div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>  numCUDABlocks = 1;</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="keywordflow">else</span> {</div>
<div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>  }</div>
<div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>  getRealComp,</div>
<div class="line"><a name="l02096"></a><span class="lineno"> 2096</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="l02097"></a><span class="lineno"> 2097</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="l02098"></a><span class="lineno"> 2098</span>  numValuesToReduce, </div>
<div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>  firstTime = 0;</div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  bra.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</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="l02108"></a><span class="lineno"> 2108</span>  }</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</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>  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="l02112"></a><span class="lineno"> 2112</span>  </div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>  <span class="comment">// compute imag component of inner product</span></div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>  getRealComp = 0;</div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>  numValuesToReduce = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>  maxReducedPerLevel = <a class="code" href="QuEST__gpu_8cu.html#aa57d77a0903e334e963c66ddc5ed3f53">REDUCE_SHARED_SIZE</a>;</div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>  firstTime = 1;</div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>  <span class="keywordflow">while</span> (numValuesToReduce > 1) {</div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  <span class="keywordflow">if</span> (numValuesToReduce < maxReducedPerLevel) {</div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>  }</div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  }</div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  <span class="keywordflow">if</span> (firstTime) {</div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  statevec_calcInnerProductKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  getRealComp,</div>
<div class="line"><a name="l02131"></a><span class="lineno"> 2131</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="l02132"></a><span class="lineno"> 2132</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="l02133"></a><span class="lineno"> 2133</span>  numValuesToReduce, </div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  bra.<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>  bra.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>  bra.<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>(&(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="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(&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="l02147"></a><span class="lineno"> 2147</span>  </div>
<div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>  <span class="comment">// return complex</span></div>
<div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>  <a class="code" href="structComplex.html">Complex</a> innerProd;</div>
<div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>  innerProd.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = innerProdReal;</div>
<div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>  innerProd.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = innerProdImag;</div>
<div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>  <span class="keywordflow">return</span> innerProd;</div>
<div class="line"><a name="l02153"></a><span class="lineno"> 2153</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00829">calcInnerProduct()</a>, <a class="el" href="QuEST__common_8c_source.html#l00464">statevec_calcExpecPauliProd()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00376">statevec_calcFidelity()</a>.</p>
</div>
</div>
<a id="a4f3c49fa4904bb120bbb6ae2e6395dfd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4f3c49fa4904bb120bbb6ae2e6395dfd">◆ </a></span>statevec_calcInnerProductKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_calcInnerProductKernel </td>
<td>(</td>
<td class="paramtype">int </td>
<td class="paramname"><em>getRealComp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecReal2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>vecImag2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTermsToSum</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes either a real or imag term in the inner product </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02038">2038</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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="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="l02044"></a><span class="lineno"> 2044</span>  <span class="keywordflow">if</span> (index >= numTermsToSum) <span class="keywordflow">return</span>;</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>  <span class="comment">// choose whether to calculate the real or imaginary term of the inner product</span></div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdTerm;</div>
<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>  <span class="keywordflow">if</span> (getRealComp)</div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>  innerProdTerm = vecReal1[index]*vecReal2[index] + vecImag1[index]*vecImag2[index];</div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  <span class="keywordflow">else</span></div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>  innerProdTerm = vecReal1[index]*vecImag2[index] - vecImag1[index]*vecReal2[index];</div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>  </div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>  <span class="comment">// array of each thread's collected sum term, to be summed</span></div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  tempReductionArray[threadIdx.x] = innerProdTerm;</div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  __syncthreads();</div>
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  </div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  <span class="comment">// every second thread reduces</span></div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2)</div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="ab33cdf01831c4545e51299178acf7f27"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab33cdf01831c4545e51299178acf7f27">◆ </a></span>statevec_calcProbOfOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_calcProbOfOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01950">1950</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span> {</div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> outcomeProb = <a class="code" href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2">statevec_findProbabilityOfZero</a>(qureg, measureQubit);</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  <span class="keywordflow">if</span> (outcome==1)</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  outcomeProb = 1.0 - outcomeProb;</div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>  <span class="keywordflow">return</span> outcomeProb;</div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01912">statevec_findProbabilityOfZero()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00845">calcProbOfOutcome()</a>, <a class="el" href="QuEST_8c_source.html#l00724">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00360">statevec_measureWithStats()</a>.</p>
</div>
</div>
<a id="ad65ad1b5ea6f30b0c6b4ffda96e1a8e6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad65ad1b5ea6f30b0c6b4ffda96e1a8e6">◆ </a></span>statevec_calcTotalProb()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_calcTotalProb </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01499">1499</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  {</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="comment">/* IJB - implemented using Kahan summation for greater accuracy at a slight floating</span></div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</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="l01502"></a><span class="lineno"> 1502</span>  <span class="comment">/* Don't change the bracketing in this routine! */</span></div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> pTotal=0;</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> y, t, c;</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> index;</div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</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="l01507"></a><span class="lineno"> 1507</span>  </div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg);</div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  </div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  c = 0.0;</div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordflow">for</span> (index=0; index<numAmpsPerRank; index++){</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index]; by Kahan */</span></div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <span class="comment">// pTotal+=qureg.stateVec.real[index]*qureg.stateVec.real[index];</span></div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</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="l01515"></a><span class="lineno"> 1515</span>  t = pTotal + y;</div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  pTotal = t;</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  </div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="comment">/* Perform pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index]; by Kahan */</span></div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  <span class="comment">//pTotal+=qureg.stateVec.imag[index]*qureg.stateVec.imag[index];</span></div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</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="l01522"></a><span class="lineno"> 1522</span>  t = pTotal + y;</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  c = ( t - pTotal ) - y;</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  pTotal = t;</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"> 1527</span>  }</div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keywordflow">return</span> pTotal;</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00407">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00822">calcTotalProb()</a>.</p>
</div>
</div>
<a id="aa4b77089145184d990848cd66993aa8b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa4b77089145184d990848cd66993aa8b">◆ </a></span>statevec_cloneQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_cloneQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>targetQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>copyQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>works for both statevectors and density matrices </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00170">170</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, and <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00163">cloneQureg()</a>, <a class="el" href="QuEST_8c_source.html#l00062">createCloneQureg()</a>, <a class="el" href="QuEST_8c_source.html#l00143">initPureState()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00464">statevec_calcExpecPauliProd()</a>.</p>
</div>
</div>
<a id="ae7f25bb40734e18a992403b17355893b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae7f25bb40734e18a992403b17355893b">◆ </a></span>statevec_collapseToKnownProbOutcome()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_collapseToKnownProbOutcome </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>outcomeProb</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02445">2445</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span> { </div>
<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02449"></a><span class="lineno"> 2449</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="l02450"></a><span class="lineno"> 2450</span>  statevec_collapseToKnownProbOutcomeKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, measureQubit, outcome, outcomeProb);</div>
<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00724">collapseToOutcome()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00360">statevec_measureWithStats()</a>.</p>
</div>
</div>
<a id="a5d2202221eed63dc9b003d716a46e879"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d2202221eed63dc9b003d716a46e879">◆ </a></span>statevec_collapseToKnownProbOutcomeKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_collapseToKnownProbOutcomeKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>totalProbability</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02388">2388</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span> {</div>
<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l02391"></a><span class="lineno"> 2391</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="l02392"></a><span class="lineno"> 2392</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l02394"></a><span class="lineno"> 2394</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="l02395"></a><span class="lineno"> 2395</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l02397"></a><span class="lineno"> 2397</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="l02398"></a><span class="lineno"> 2398</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l02399"></a><span class="lineno"> 2399</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="l02400"></a><span class="lineno"> 2400</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l02401"></a><span class="lineno"> 2401</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="l02402"></a><span class="lineno"> 2402</span>  </div>
<div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>  </div>
<div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>  </div>
<div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>  <span class="comment">//</span></div>
<div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>  renorm=1/sqrt(totalProbability);</div>
<div class="line"><a name="l02418"></a><span class="lineno"> 2418</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="l02419"></a><span class="lineno"> 2419</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="l02420"></a><span class="lineno"> 2420</span>  </div>
<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  </div>
<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  <span class="keywordflow">if</span> (outcome==0){</div>
<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  stateVecReal[index]=stateVecReal[index]*renorm;</div>
<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  stateVecImag[index]=stateVecImag[index]*renorm;</div>
<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  </div>
<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  stateVecReal[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  stateVecImag[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (outcome==1){</div>
<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>  stateVecReal[index]=0;</div>
<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  stateVecImag[index]=0;</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>  stateVecReal[index+sizeHalfBlock]=stateVecReal[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>  stateVecImag[index+sizeHalfBlock]=stateVecImag[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>  }</div>
<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a94ee4df9faba286ad7a5bc829ef5174d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a94ee4df9faba286ad7a5bc829ef5174d">◆ </a></span>statevec_compactUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_compactUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00722">722</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> {</div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</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="l00727"></a><span class="lineno"> 727</span>  statevec_compactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00403">compactUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00410">statevec_multiRotatePauli()</a>, <a class="el" href="QuEST__common_8c_source.html#l00310">statevec_rotateAroundAxis()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00317">statevec_rotateAroundAxisConj()</a>.</p>
</div>
</div>
<a id="a1338d7ca4e83bbb81da02aca456c53e6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1338d7ca4e83bbb81da02aca456c53e6">◆ </a></span>statevec_compactUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_compactUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>rotQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00667">667</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  {</div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</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="l00670"></a><span class="lineno"> 670</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</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="l00673"></a><span class="lineno"> 673</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  </div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</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="l00677"></a><span class="lineno"> 677</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</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="l00680"></a><span class="lineno"> 680</span>  <span class="keyword">const</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="l00681"></a><span class="lineno"> 681</span>  </div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  sizeHalfBlock = 1LL << rotQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</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>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  </div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</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="l00691"></a><span class="lineno"> 691</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="l00692"></a><span class="lineno"> 692</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="l00693"></a><span class="lineno"> 693</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="l00694"></a><span class="lineno"> 694</span>  </div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  </div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  </div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  </div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  </div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  </div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
</div>
</div>
<a id="ae6cecbad32a03416138b321cdc1a2c33"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae6cecbad32a03416138b321cdc1a2c33">◆ </a></span>statevec_compareStates()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int statevec_compareStates </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>mq1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>mq2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>precision</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00649">649</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  {</div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> diff;</div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keywordtype">int</span> chunkSize = mq1.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  </div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq1);</div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(mq2);</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="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<chunkSize; i++){</div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</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="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</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="l00661"></a><span class="lineno"> 661</span>  <span class="keywordflow">if</span> (diff<0) diff *= -1;</div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keywordflow">if</span> (diff>precision) <span class="keywordflow">return</span> 0;</div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  }</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00407">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01052">compareStates()</a>.</p>
</div>
</div>
<a id="a47b467a5445c7f15d1a8b0b2ec0ef2de"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a47b467a5445c7f15d1a8b0b2ec0ef2de">◆ </a></span>statevec_controlledCompactUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledCompactUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00789">789</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00790"></a><span class="lineno"> 790</span> {</div>
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00793"></a><span class="lineno"> 793</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="l00794"></a><span class="lineno"> 794</span>  statevec_controlledCompactUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, alpha, beta);</div>
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00416">controlledCompactUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00326">statevec_controlledRotateAroundAxis()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00333">statevec_controlledRotateAroundAxisConj()</a>.</p>
</div>
</div>
<a id="a55fdf6604434dab8a5c0b8522b6cc10c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a55fdf6604434dab8a5c0b8522b6cc10c">◆ </a></span>statevec_controlledCompactUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledCompactUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00730">730</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</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="l00733"></a><span class="lineno"> 733</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</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="l00736"></a><span class="lineno"> 736</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  </div>
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00739"></a><span class="lineno"> 739</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="l00740"></a><span class="lineno"> 740</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00742"></a><span class="lineno"> 742</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="l00743"></a><span class="lineno"> 743</span>  <span class="keyword">const</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="l00744"></a><span class="lineno"> 744</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  </div>
<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  </div>
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  </div>
<div class="line"><a name="l00754"></a><span class="lineno"> 754</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="l00755"></a><span class="lineno"> 755</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="l00756"></a><span class="lineno"> 756</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="l00757"></a><span class="lineno"> 757</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="l00758"></a><span class="lineno"> 758</span>  </div>
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  </div>
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  </div>
<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  </div>
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  stateImagLo = stateVecImag[indexLo];</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>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  </div>
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div>
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
</div>
</div>
<a id="a114038296eb404b9b8a66aaad7b48800"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a114038296eb404b9b8a66aaad7b48800">◆ </a></span>statevec_controlledNot()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledNot </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01717">1717</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span> {</div>
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</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="l01722"></a><span class="lineno"> 1722</span>  statevec_controlledNotKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit);</div>
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00523">controlledNot()</a>.</p>
</div>
</div>
<a id="aca8a32f46dbaabdbffc38d7b8023bf20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aca8a32f46dbaabdbffc38d7b8023bf20">◆ </a></span>statevec_controlledNotKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledNotKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01678">1678</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> {</div>
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</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="l01682"></a><span class="lineno"> 1682</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  <span class="keywordtype">int</span> controlBit;</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>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</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="l01688"></a><span class="lineno"> 1688</span>  stateImagUp; <span class="comment">// (used in updates)</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> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  </div>
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</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="l01696"></a><span class="lineno"> 1696</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="l01697"></a><span class="lineno"> 1697</span>  </div>
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  </div>
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  </div>
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  </div>
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  stateVecImag[indexLo] = stateImagUp;</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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a708246b16236c492094c2633da0c08ff"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a708246b16236c492094c2633da0c08ff">◆ </a></span>statevec_controlledPauliY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPauliY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01323">1323</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span> {</div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  <span class="keywordtype">int</span> conjFactor = 1;</div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</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="l01329"></a><span class="lineno"> 1329</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00535">controlledPauliY()</a>.</p>
</div>
</div>
<a id="a9e647339720bf82b30c6331fad544ec5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9e647339720bf82b30c6331fad544ec5">◆ </a></span>statevec_controlledPauliYConj()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPauliYConj </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01332">1332</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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="keywordtype">int</span> conjFactor = -1;</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</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="l01338"></a><span class="lineno"> 1338</span>  statevec_controlledPauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, conjFactor);</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00535">controlledPauliY()</a>.</p>
</div>
</div>
<a id="a9c7dfe745a3bb35f18440891d267e963"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9c7dfe745a3bb35f18440891d267e963">◆ </a></span>statevec_controlledPauliYKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledPauliYKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>conjFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01287">1287</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span> {</div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  </div>
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp; </div>
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</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="l01296"></a><span class="lineno"> 1296</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  sizeBlock = 2LL * sizeHalfBlock;</div>
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  </div>
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</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="l01301"></a><span class="lineno"> 1301</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="l01302"></a><span class="lineno"> 1302</span>  </div>
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  <span class="keywordflow">if</span> (index>=(stateVecSize>>1)) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  thisBlock = index / sizeHalfBlock;</div>
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  indexUp = thisBlock*sizeBlock + index%sizeHalfBlock;</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  </div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  </div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  stateImagUp = stateVecImag[indexUp];</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>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  }</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a7c0067cb9f243ead20de7392aea328bc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7c0067cb9f243ead20de7392aea328bc">◆ </a></span>statevec_controlledPhaseFlip()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPhaseFlip </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01552">1552</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> {</div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</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="l01557"></a><span class="lineno"> 1557</span>  statevec_controlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2);</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00547">controlledPhaseFlip()</a>.</p>
</div>
</div>
<a id="abf9e7eae332bbbd2e8b7b9c3ca3bad92"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abf9e7eae332bbbd2e8b7b9c3ca3bad92">◆ </a></span>statevec_controlledPhaseFlipKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledPhaseFlipKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01531">1531</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> {</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  <span class="keywordtype">int</span> bit1, bit2;</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>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</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="l01539"></a><span class="lineno"> 1539</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="l01540"></a><span class="lineno"> 1540</span>  </div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  </div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  stateVecImag [index] = - stateVecImag [index];</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="adeb715f3f2c167f9bfbe92b75f5988ce"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adeb715f3f2c167f9bfbe92b75f5988ce">◆ </a></span>statevec_controlledPhaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPhaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01405">1405</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span> {</div>
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  </div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</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="l01413"></a><span class="lineno"> 1413</span>  statevec_controlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, idQubit1, idQubit2, cosAngle, sinAngle);</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00497">controlledPhaseShift()</a>.</p>
</div>
</div>
<a id="af7723faf3f94342480a54fc2137522ce"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af7723faf3f94342480a54fc2137522ce">◆ </a></span>statevec_controlledPhaseShiftKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledPhaseShiftKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>idQubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01380">1380</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> {</div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="keywordtype">int</span> bit1, bit2;</div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  </div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</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="l01389"></a><span class="lineno"> 1389</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="l01390"></a><span class="lineno"> 1390</span>  </div>
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  </div>
<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  bit1 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit1, index);</div>
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  bit2 = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a> (idQubit2, index);</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="keywordflow">if</span> (bit1 && bit2) {</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  stateImagLo = stateVecImag[index];</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>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a2600999a19c817bfcf7ca14779e33b9a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2600999a19c817bfcf7ca14779e33b9a">◆ </a></span>statevec_controlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01115">1115</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> {</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</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="l01120"></a><span class="lineno"> 1120</span>  statevec_controlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, controlQubit, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00359">controlledUnitary()</a>.</p>
</div>
</div>
<a id="a4295d3add539f787362b56adf5d155f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4295d3add539f787362b56adf5d155f0">◆ </a></span>statevec_controlledUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_controlledUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix2 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01057">1057</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  {</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</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="l01060"></a><span class="lineno"> 1060</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</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="l01063"></a><span class="lineno"> 1063</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  </div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</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="l01067"></a><span class="lineno"> 1067</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</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="l01070"></a><span class="lineno"> 1070</span>  <span class="keyword">const</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="l01071"></a><span class="lineno"> 1071</span>  </div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  </div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  </div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  </div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</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="l01083"></a><span class="lineno"> 1083</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="l01084"></a><span class="lineno"> 1084</span>  </div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  </div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  </div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  </div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  </div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(controlQubit, indexUp);</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  </div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  }</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a365bbb1b80cb00405c8bf1a4fa1ea8e5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a365bbb1b80cb00405c8bf1a4fa1ea8e5">◆ </a></span>statevec_createQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_createQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> * </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00275">275</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00174">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00163">Qureg::isDensityMatrix</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00172">Qureg::numAmpsTotal</a>, <a class="el" href="QuEST_8h_source.html#l00176">Qureg::numChunks</a>, <a class="el" href="QuEST_8h_source.html#l00167">Qureg::numQubitsInStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00202">QuESTEnv::numRanks</a>, <a class="el" href="QuEST_8h_source.html#l00181">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00201">QuESTEnv::rank</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00062">createCloneQureg()</a>, <a class="el" href="QuEST_8c_source.html#l00048">createDensityQureg()</a>, and <a class="el" href="QuEST_8c_source.html#l00034">createQureg()</a>.</p>
</div>
</div>
<a id="a2a52ad9f9ad9b2fd6a76f6d433b3b217"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2a52ad9f9ad9b2fd6a76f6d433b3b217">◆ </a></span>statevec_destroyQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_destroyQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00321">321</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00202">QuESTEnv::numRanks</a>, <a class="el" href="QuEST_8h_source.html#l00181">Qureg::pairStateVec</a>, and <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00075">destroyQureg()</a>.</p>
</div>
</div>
<a id="a067da9fba487d5821fbd689718b19de2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a067da9fba487d5821fbd689718b19de2">◆ </a></span>statevec_findProbabilityOfZero()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_findProbabilityOfZero </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01912">1912</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span> {</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</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="l01915"></a><span class="lineno"> 1915</span>  <span class="keywordtype">int</span> valuesPerCUDABlock, numCUDABlocks, sharedMemSize;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateProb=0;</div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  <span class="keywordtype">int</span> firstTime=1;</div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</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="l01919"></a><span class="lineno"> 1919</span>  </div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  <span class="keywordflow">while</span>(numValuesToReduce>1){ </div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="keywordflow">if</span> (numValuesToReduce<maxReducedPerLevel){</div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  <span class="comment">// Need less than one CUDA block to reduce values</span></div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  valuesPerCUDABlock = numValuesToReduce;</div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  numCUDABlocks = 1;</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  <span class="comment">// Use full CUDA blocks, with block size constrained by shared mem usage</span></div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  valuesPerCUDABlock = maxReducedPerLevel;</div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  numCUDABlocks = ceil((<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>)numValuesToReduce/valuesPerCUDABlock);</div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  }</div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  sharedMemSize = valuesPerCUDABlock*<span class="keyword">sizeof</span>(<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>);</div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  </div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  <span class="keywordflow">if</span> (firstTime){</div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  statevec_findProbabilityOfZeroKernel<<<numCUDABlocks, valuesPerCUDABlock, sharedMemSize>>>(</div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  qureg, measureQubit, qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>);</div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>  firstTime=0;</div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <a class="code" href="QuEST__gpu_8cu.html#aea20d173141544e6c5359955a1fbe997">copySharedReduceBlock</a><<<numCUDABlocks, valuesPerCUDABlock/2, sharedMemSize>>>(</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  qureg.<a class="code" href="structQureg.html#a2d0007a026a4231b338a5037c4e861b2">firstLevelReduction</a>, </div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  qureg.<a class="code" href="structQureg.html#a8bb9f7517470a0cc406951935f37b64f">secondLevelReduction</a>, valuesPerCUDABlock); </div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  cudaDeviceSynchronize(); </div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</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="l01943"></a><span class="lineno"> 1943</span>  }</div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  numValuesToReduce = numValuesToReduce/maxReducedPerLevel;</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  }</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</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="l01947"></a><span class="lineno"> 1947</span>  <span class="keywordflow">return</span> stateProb;</div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l01751">copySharedReduceBlock()</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::firstLevelReduction</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00019">REDUCE_SHARED_SIZE</a>, <a class="el" href="QuEST_8h_source.html#l00186">Qureg::secondLevelReduction</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01857">swapDouble()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l01950">statevec_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="aae568d73d0de878acffe3798779de474"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aae568d73d0de878acffe3798779de474">◆ </a></span>statevec_findProbabilityOfZeroKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_findProbabilityOfZeroKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reducedArray</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01798">1798</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  {</div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</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="l01803"></a><span class="lineno"> 1803</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</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="l01806"></a><span class="lineno"> 1806</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</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="l01809"></a><span class="lineno"> 1809</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="l01810"></a><span class="lineno"> 1810</span>  <span class="comment">// (good for shared memory parallelism)</span></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="keyword">extern</span> __shared__ <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> tempReductionArray[];</div>
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  </div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  </div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  <span class="comment">// ---------------------------------------------------------------- //</span></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>  <span class="comment">//</span></div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  <span class="comment">// --- task-based shared-memory parallel implementation</span></div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  <span class="comment">//</span></div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  </div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</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="l01830"></a><span class="lineno"> 1830</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="l01831"></a><span class="lineno"> 1831</span>  </div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>  </div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realVal, imagVal;</div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>  realVal = stateVecReal[index];</div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  imagVal = stateVecImag[index]; </div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  tempReductionArray[threadIdx.x] = realVal*realVal + imagVal*imagVal;</div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  __syncthreads();</div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  </div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  <span class="keywordflow">if</span> (threadIdx.x<blockDim.x/2){</div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  <a class="code" href="QuEST__gpu_8cu.html#ac82f3dbf68f877f57d4abbb72fae1254">reduceBlock</a>(tempReductionArray, reducedArray, blockDim.x);</div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  }</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01732">reduceBlock()</a>.</p>
</div>
</div>
<a id="abd509244d57657e148e4084c5ab5d28f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abd509244d57657e148e4084c5ab5d28f">◆ </a></span>statevec_getImagAmp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_getImagAmp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00454">454</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  {</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag[index]), </div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00697">getAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00707">getDensityAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00683">getImagAmp()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00244">statevec_getProbAmp()</a>.</p>
</div>
</div>
<a id="abc9a9ef4344c7faaaf28ac25c76649b9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abc9a9ef4344c7faaaf28ac25c76649b9">◆ </a></span>statevec_getRealAmp()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_getRealAmp </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00447">447</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  {</div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> el=0;</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  cudaMemcpy(&el, &(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real[index]), </div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keyword">sizeof</span>(*(qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real)), cudaMemcpyDeviceToHost);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">return</span> el;</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00697">getAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00707">getDensityAmp()</a>, <a class="el" href="QuEST_8c_source.html#l00676">getRealAmp()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00244">statevec_getProbAmp()</a>.</p>
</div>
</div>
<a id="a9226f386d010aaa85efc0e8889d341d5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9226f386d010aaa85efc0e8889d341d5">◆ </a></span>statevec_hadamard()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_hadamard </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01670">1670</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> {</div>
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</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="l01675"></a><span class="lineno"> 1675</span>  statevec_hadamardKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00175">hadamard()</a>.</p>
</div>
</div>
<a id="a14b5999f157b704aced4776c9ccbc982"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a14b5999f157b704aced4776c9ccbc982">◆ </a></span>statevec_hadamardKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_hadamardKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01621">1621</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  {</div>
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</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="l01624"></a><span class="lineno"> 1624</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</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="l01627"></a><span class="lineno"> 1627</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  </div>
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</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="l01631"></a><span class="lineno"> 1631</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</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="l01634"></a><span class="lineno"> 1634</span>  <span class="keyword">const</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="l01635"></a><span class="lineno"> 1635</span>  </div>
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></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="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  </div>
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</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="l01645"></a><span class="lineno"> 1645</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="l01646"></a><span class="lineno"> 1646</span>  </div>
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> recRoot2 = 1.0/sqrt(2.0);</div>
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  </div>
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</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>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  </div>
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  </div>
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  </div>
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  stateVecReal[indexUp] = recRoot2*(stateRealUp + stateRealLo);</div>
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  stateVecImag[indexUp] = recRoot2*(stateImagUp + stateImagLo);</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>  stateVecReal[indexLo] = recRoot2*(stateRealUp - stateRealLo);</div>
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  stateVecImag[indexLo] = recRoot2*(stateImagUp - stateImagLo);</div>
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a758bad4237ff0bf3b4ff5be626a982ae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a758bad4237ff0bf3b4ff5be626a982ae">◆ </a></span>statevec_initBlankState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initBlankState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00471">471</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00472"></a><span class="lineno"> 472</span> {</div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</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="l00476"></a><span class="lineno"> 476</span>  statevec_initBlankStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00117">initBlankState()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00493">statevec_applyPauliSum()</a>.</p>
</div>
</div>
<a id="a2116805f30cb063a0e7c0341583d1550"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2116805f30cb063a0e7c0341583d1550">◆ </a></span>statevec_initBlankStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initBlankStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00461">461</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="comment">// initialise the statevector to be all-zeros</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a288dc4b46bdacd69cbf4a6fd070d26a7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a288dc4b46bdacd69cbf4a6fd070d26a7">◆ </a></span>statevec_initClassicalState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initClassicalState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00546">546</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> {</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</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="l00551"></a><span class="lineno"> 551</span>  statevec_initClassicalStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag, stateInd);</div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00132">initClassicalState()</a>.</p>
</div>
</div>
<a id="a0f1817fe73e2911937af3979b6506ebd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0f1817fe73e2911937af3979b6506ebd">◆ </a></span>statevec_initClassicalStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initClassicalStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00531">531</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  {</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  </div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// initialise the state to |stateInd></span></div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  </div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (index==stateInd){</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="comment">// classical state has probability 1</span></div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  stateVecReal[stateInd] = 1.0;</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  stateVecImag[stateInd] = 0.0;</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  }</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="ad9fd3017ea40cf63fd04b39e03494972"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad9fd3017ea40cf63fd04b39e03494972">◆ </a></span>statevec_initDebugState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initDebugState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialise the state vector of probability amplitudes to an (unphysical) state with each component of each probability amplitude a unique floating point value. </p>
<p>For debugging processes </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits to be initialised </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00567">567</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> {</div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</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="l00572"></a><span class="lineno"> 572</span>  statevec_initDebugStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>,</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01057">initDebugState()</a>.</p>
</div>
</div>
<a id="ad947613d4d62b0b659a0be1e9c736427"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad947613d4d62b0b659a0be1e9c736427">◆ </a></span>statevec_initDebugStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initDebugStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00557">557</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  </div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  </div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  stateVecReal[index] = (index*2.0)/10.0;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  stateVecImag[index] = (index*2.0+1.0)/10.0;</div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a482fc361fd5f08075404c72e536316a0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a482fc361fd5f08075404c72e536316a0">◆ </a></span>statevec_initPlusState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initPlusState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00520">520</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00521"></a><span class="lineno"> 521</span> {</div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</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="l00525"></a><span class="lineno"> 525</span>  statevec_initPlusStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00123">initPlusState()</a>.</p>
</div>
</div>
<a id="aaa36e3e86a5b79e676c6268fa2b02222"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaa36e3e86a5b79e676c6268fa2b02222">◆ </a></span>statevec_initPlusStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initPlusStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00509">509</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  {</div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  </div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</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>  <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="l00516"></a><span class="lineno"> 516</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a05756b45f10135bb2eeb07380f806c20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a05756b45f10135bb2eeb07380f806c20">◆ </a></span>statevec_initStateFromSingleFile()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int statevec_initStateFromSingleFile </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> * </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">char </td>
<td class="paramname"><em>filename</em>[200], </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00605">605</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  {</div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize, stateVecSize;</div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> indexInChunk, totalIndex;</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  </div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  chunkSize = qureg-><a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  stateVecSize = chunkSize*qureg-><a class="code" href="structQureg.html#aa3deb7163aab90a61e755a1f200f5413">numChunks</a>;</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  </div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</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="l00613"></a><span class="lineno"> 613</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="l00614"></a><span class="lineno"> 614</span>  </div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  FILE *fp;</div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordtype">char</span> line[200];</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>  fp = fopen(filename, <span class="stringliteral">"r"</span>);</div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">if</span> (fp == NULL)</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keywordflow">return</span> 0;</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>  indexInChunk = 0; totalIndex = 0;</div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</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="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">if</span> (line[0]!=<span class="charliteral">'#'</span>){</div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordtype">int</span> chunkId = totalIndex/chunkSize;</div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordflow">if</span> (chunkId==qureg-><a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>){</div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="preprocessor"> # if QuEST_PREC==1</span></div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  sscanf(line, <span class="stringliteral">"%f, %f"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="preprocessor"> # elif QuEST_PREC==2</span></div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span> <span class="preprocessor"> # elif QuEST_PREC==4</span></div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  sscanf(line, <span class="stringliteral">"%lf, %lf"</span>, &(stateVecReal[indexInChunk]),</div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  &(stateVecImag[indexInChunk]));</div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  indexInChunk += 1;</div>
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  }</div>
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  totalIndex += 1;</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"> 642</span>  fclose(fp);</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <a class="code" href="group__debug.html#ga11448560006dd165128e404b54ebb2f7">copyStateToGPU</a>(*qureg);</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  </div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="comment">// indicate success</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordflow">return</span> 1;</div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00174">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00397">copyStateToGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00176">Qureg::numChunks</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01061">initStateFromSingleFile()</a>.</p>
</div>
</div>
<a id="a923906770cac0da9e3459bae58de9e64"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a923906770cac0da9e3459bae58de9e64">◆ </a></span>statevec_initStateOfSingleQubit()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initStateOfSingleQubit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> * </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubitId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialise the state vector of probability amplitudes such that one qubit is set to 'outcome' and all other qubits are in an equal superposition of zero and one. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits to be initialised </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">qubitId</td><td>id of qubit to set to state 'outcome' </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">value</td><td>of qubit 'qubitId' </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00596">596</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00597"></a><span class="lineno"> 597</span> {</div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</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="l00601"></a><span class="lineno"> 601</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="l00602"></a><span class="lineno"> 602</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01066">initStateOfSingleQubit()</a>.</p>
</div>
</div>
<a id="ace807c2089e172363db9ffe083f60f71"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ace807c2089e172363db9ffe083f60f71">◆ </a></span>statevec_initStateOfSingleQubitKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initStateOfSingleQubitKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubitId</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00578">578</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  {</div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordtype">int</span> bit;</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>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  </div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</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="l00586"></a><span class="lineno"> 586</span>  bit = <a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(qubitId, index);</div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">if</span> (bit==outcome) {</div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  stateVecReal[index] = normFactor;</div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  }</div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a2ca0c6ba07ab2b4b437321bf17efc966"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2ca0c6ba07ab2b4b437321bf17efc966">◆ </a></span>statevec_initZeroState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_initZeroState </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00498">498</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> {</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</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="l00503"></a><span class="lineno"> 503</span>  statevec_initZeroStateKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>, </div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.real, </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  qureg.<a class="code" href="structQureg.html#ac181d7b3b94fff179dc74d7935ecd9e1">deviceStateVec</a>.imag);</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00111">initZeroState()</a>.</p>
</div>
</div>
<a id="a43b35abfab0d6093b052e2c2e4b15064"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a43b35abfab0d6093b052e2c2e4b15064">◆ </a></span>statevec_initZeroStateKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_initZeroStateKernel </td>
<td>(</td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>stateVecSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecReal</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>stateVecImag</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00482">482</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  {</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  </div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="comment">// initialise the state to |0000..0000></span></div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  stateVecReal[index] = 0.0;</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  stateVecImag[index] = 0.0;</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  </div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">if</span> (index==0){</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="comment">// zero state |0000..0000> has probability 1</span></div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  stateVecReal[0] = 1.0;</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  stateVecImag[0] = 0.0;</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  }</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a47dcab9a0e6b07ddde264ed924add26c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a47dcab9a0e6b07ddde264ed924add26c">◆ </a></span>statevec_multiControlledMultiQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. </p>
<p>It is already gauranteed here that all target qubits can fit on each node (this is validated in the front-end)</p>
<p>@TODO: refactor so that the 'swap back' isn't performed; instead the qubit locations are updated. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00917">917</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00918"></a><span class="lineno"> 918</span> {</div>
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00920"></a><span class="lineno"> 920</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="l00921"></a><span class="lineno"> 921</span>  </div>
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  <span class="comment">// allocate device space for global {targs} (length: numTargs) and populate</span></div>
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="keywordtype">int</span> *d_targs;</div>
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="keywordtype">size_t</span> targMemSize = numTargs * <span class="keyword">sizeof</span> *d_targs;</div>
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  cudaMalloc(&d_targs, targMemSize);</div>
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  cudaMemcpy(d_targs, targs, targMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  </div>
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="comment">// flatten out the u.real and u.imag lists</span></div>
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordtype">int</span> uNumRows = (1 << u.<a class="code" href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">numQubits</a>);</div>
<div class="line"><a name="l00930"></a><span class="lineno"> 930</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="l00931"></a><span class="lineno"> 931</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="l00932"></a><span class="lineno"> 932</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> i = 0;</div>
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < uNumRows; r++)</div>
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < uNumRows; c++) {</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  uReFlat[i] = u.<a class="code" href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">real</a>[r][c];</div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  uImFlat[i] = u.<a class="code" href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">imag</a>[r][c];</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  i++;</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  }</div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  </div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</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="l00941"></a><span class="lineno"> 941</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uRe;</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* d_uIm;</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</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="l00944"></a><span class="lineno"> 944</span>  cudaMalloc(&d_uRe, uMemSize);</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  cudaMalloc(&d_uIm, uMemSize);</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  cudaMemcpy(d_uRe, uReFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  cudaMemcpy(d_uIm, uImFlat, uMemSize, cudaMemcpyHostToDevice);</div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  </div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="comment">// allocate device Wspace for thread-local {ampInds}, {reAmps}, {imAmps} (length: 1<<numTargs)</span></div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> *d_ampInds;</div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_reAmps;</div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *d_imAmps;</div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keywordtype">size_t</span> gridSize = (size_t) threadsPerCUDABlock * CUDABlocks;</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="keywordtype">int</span> numTargAmps = uNumRows;</div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  cudaMalloc(&d_ampInds, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_ampInds);</div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  cudaMalloc(&d_reAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_reAmps);</div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  cudaMalloc(&d_imAmps, numTargAmps*gridSize * <span class="keyword">sizeof</span> *d_imAmps);</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">// call kernel</span></div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  statevec_multiControlledMultiQubitUnitaryKernel<<<CUDABlocks,threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  qureg, ctrlMask, d_targs, numTargs, d_uRe, d_uIm, d_ampInds, d_reAmps, d_imAmps, numTargAmps);</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  </div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="comment">// free kernel memory</span></div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  free(uReFlat);</div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  free(uImFlat);</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  cudaFree(d_targs);</div>
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  cudaFree(d_uRe);</div>
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  cudaFree(d_uIm);</div>
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  cudaFree(d_ampInds);</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  cudaFree(d_reAmps);</div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  cudaFree(d_imAmps);</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00140">ComplexMatrixN::imag</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00138">ComplexMatrixN::numQubits</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00139">ComplexMatrixN::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00589">densmatr_applyMultiQubitKrausSuperoperator()</a>, <a class="el" href="QuEST__common_8c_source.html#l00581">densmatr_applyTwoQubitKrausSuperoperator()</a>, <a class="el" href="QuEST_8c_source.html#l00329">multiControlledMultiQubitUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00534">statevec_controlledMultiQubitUnitary()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00528">statevec_multiQubitUnitary()</a>.</p>
</div>
</div>
<a id="afd7fc4d67072a80dbc609bf328b5be20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afd7fc4d67072a80dbc609bf328b5be20">◆ </a></span>statevec_multiControlledMultiQubitUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledMultiQubitUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>uRe</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>uIm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int * </td>
<td class="paramname"><em>ampInds</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reAmps</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>imAmps</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numTargAmps</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00858">858</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> {</div>
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  </div>
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// decide the amplitudes this thread will modify</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 = blockIdx.x*blockDim.x + threadIdx.x; </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> >> numTargs; <span class="comment">// kernel called on every 1 in 2^numTargs amplitudes</span></div>
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</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>  <span class="comment">// find this task's start index (where all targs are 0)</span></div>
<div class="line"><a name="l00869"></a><span class="lineno"> 869</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#a5f14823d1125e973c4b350bd6ac84552">insertZeroBits</a>(thisTask, targs, numTargs);</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">// this task only modifies amplitudes if control qubits are 1 for this state</span></div>
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  </div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</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="l00876"></a><span class="lineno"> 876</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="l00877"></a><span class="lineno"> 877</span>  </div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="comment">/*</span></div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span> <span class="comment"> each thread needs:</span></div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span> <span class="comment"> long long int ampInds[numAmps];</span></div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span> <span class="comment"> qreal reAmps[numAmps];</span></div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span> <span class="comment"> qreal imAmps[numAmps];</span></div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span> <span class="comment"> but instead has access to shared arrays, with below stride and offset</span></div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="comment"> */</span></div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="keywordtype">size_t</span> stride = gridDim.x*blockDim.x;</div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keywordtype">size_t</span> offset = blockIdx.x*blockDim.x + threadIdx.x;</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>  <span class="comment">// determine the indices and record values of target amps</span></div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind;</div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i < numTargAmps; i++) {</div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  </div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="comment">// get global index of current target qubit assignment</span></div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  ind = ind00;</div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numTargs; t++)</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a>(t, i))</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  ind = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind, targs[t]);</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  </div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  ampInds[i*stride+offset] = ind;</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  reAmps [i*stride+offset] = reVec[ind];</div>
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  imAmps [i*stride+offset] = imVec[ind];</div>
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  }</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">// update the amplitudes</span></div>
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> r=0; r < numTargAmps; r++) {</div>
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  ind = ampInds[r*stride+offset];</div>
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  reVec[ind] = 0;</div>
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  imVec[ind] = 0;</div>
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> c=0; c < numTargAmps; c++) {</div>
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uReElem = uRe[c + r*numTargAmps];</div>
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> uImElem = uIm[c + r*numTargAmps];</div>
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  reVec[ind] += reAmps[c*stride+offset]*uReElem - imAmps[c*stride+offset]*uImElem;</div>
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  imVec[ind] += reAmps[c*stride+offset]*uImElem + imAmps[c*stride+offset]*uReElem;</div>
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  }</div>
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  }</div>
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00112">insertZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="ac4ee5979d475e8c729294b8ef7e0270d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac4ee5979d475e8c729294b8ef7e0270d">◆ </a></span>statevec_multiControlledPhaseFlip()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledPhaseFlip </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numControlQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01578">1578</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</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#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</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="l01584"></a><span class="lineno"> 1584</span>  statevec_multiControlledPhaseFlipKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask);</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00559">multiControlledPhaseFlip()</a>.</p>
</div>
</div>
<a id="ab1f13b1980ec46bac75e97c578d15e98"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab1f13b1980ec46bac75e97c578d15e98">◆ </a></span>statevec_multiControlledPhaseFlipKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledPhaseFlipKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01560">1560</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> {</div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</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> stateVecSize;</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>  stateVecSize = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</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="l01567"></a><span class="lineno"> 1567</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="l01568"></a><span class="lineno"> 1568</span>  </div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  index = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  </div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  stateVecReal [index] = - stateVecReal [index];</div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  stateVecImag [index] = - stateVecImag [index];</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  }</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="aa662796ea6e0f471143c53becae8c12c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa662796ea6e0f471143c53becae8c12c">◆ </a></span>statevec_multiControlledPhaseShift()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledPhaseShift </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>controlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numControlQubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01436">1436</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span> { </div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> cosAngle = cos(angle);</div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle);</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  </div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</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#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a>(controlQubits, numControlQubits);</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>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</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="l01446"></a><span class="lineno"> 1446</span>  statevec_multiControlledPhaseShiftKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__common_8c_source.html#l00043">getQubitBitMask()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00509">multiControlledPhaseShift()</a>.</p>
</div>
</div>
<a id="a11dc3581b1efe1332854eac7594bc647"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a11dc3581b1efe1332854eac7594bc647">◆ </a></span>statevec_multiControlledPhaseShiftKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledPhaseShiftKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01416">1416</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  {</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo;</div>
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateVecSize;</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) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  </div>
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordflow">if</span> (mask == (mask & index) ){</div>
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  stateRealLo = stateVecReal[index];</div>
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  stateImagLo = stateVecImag[index];</div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  stateVecReal[index] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  stateVecImag[index] = sinAngle*stateRealLo + cosAngle*stateImagLo;</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> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a49af21aad0ad254c64a10cb6d39e4a64"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a49af21aad0ad254c64a10cb6d39e4a64">◆ </a></span>statevec_multiControlledTwoQubitUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledTwoQubitUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>q1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>q2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This calls swapQubitAmps only when it would involve a distributed communication; if the qubit chunks already fit in the node, it operates the unitary direct. </p>
<p>Note the order of q1 and q2 in the call to twoQubitUnitaryLocal is important.</p>
<p>@TODO: refactor so that the 'swap back' isn't performed; instead the qubit locations are updated. @TODO: the double swap (q1,q2 to 0,1) may be possible simultaneously by a bespoke swap routine. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01050">1050</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> {</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</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="l01054"></a><span class="lineno"> 1054</span>  statevec_multiControlledTwoQubitUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, ctrlMask, q1, q2, argifyMatrix4(u));</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00575">densmatr_applyKrausSuperoperator()</a>, <a class="el" href="QuEST_8c_source.html#l00281">multiControlledTwoQubitUnitary()</a>, <a class="el" href="QuEST__common_8c_source.html#l00522">statevec_controlledTwoQubitUnitary()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00516">statevec_twoQubitUnitary()</a>.</p>
</div>
</div>
<a id="ad4ec89e571c55b3d0dee1413a2fd1d43"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad4ec89e571c55b3d0dee1413a2fd1d43">◆ </a></span>statevec_multiControlledTwoQubitUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledTwoQubitUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>q1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>q2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix4 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00974">974</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  {</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  </div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <span class="comment">// decide the 4 amplitudes this thread will modify</span></div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</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="l00978"></a><span class="lineno"> 978</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="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  </div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</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="l00982"></a><span class="lineno"> 982</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="l00983"></a><span class="lineno"> 983</span>  </div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <span class="comment">// find indices of amplitudes to modify (treat q1 as the least significant bit)</span></div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</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="l00986"></a><span class="lineno"> 986</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a>(thisTask, q1, q2);</div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  </div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="comment">// modify only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="keywordflow">if</span> (ctrlMask && (ctrlMask&ind00) != ctrlMask)</div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  </div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, q1);</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, q2);</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  ind11 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind01, q2);</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  </div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re00, re01, re10, re11;</div>
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im00, im01, im10, im11;</div>
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  re00 = reVec[ind00]; im00 = imVec[ind00];</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  re11 = reVec[ind11]; im11 = imVec[ind11];</div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  </div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  <span class="comment">// apply u * {amp00, amp01, amp10, amp11}</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  reVec[ind00] = </div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  u.r0c0.real*re00 - u.r0c0.imag*im00 +</div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  u.r0c1.real*re01 - u.r0c1.imag*im01 +</div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  u.r0c2.real*re10 - u.r0c2.imag*im10 +</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  u.r0c3.real*re11 - u.r0c3.imag*im11;</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  imVec[ind00] =</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  u.r0c0.imag*re00 + u.r0c0.real*im00 +</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  u.r0c1.imag*re01 + u.r0c1.real*im01 +</div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  u.r0c2.imag*re10 + u.r0c2.real*im10 +</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  u.r0c3.imag*re11 + u.r0c3.real*im11;</div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  </div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  reVec[ind01] = </div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  u.r1c0.real*re00 - u.r1c0.imag*im00 +</div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  u.r1c1.real*re01 - u.r1c1.imag*im01 +</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  u.r1c2.real*re10 - u.r1c2.imag*im10 +</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  u.r1c3.real*re11 - u.r1c3.imag*im11;</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  imVec[ind01] =</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  u.r1c0.imag*re00 + u.r1c0.real*im00 +</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  u.r1c1.imag*re01 + u.r1c1.real*im01 +</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  u.r1c2.imag*re10 + u.r1c2.real*im10 +</div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  u.r1c3.imag*re11 + u.r1c3.real*im11;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  </div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  reVec[ind10] = </div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  u.r2c0.real*re00 - u.r2c0.imag*im00 +</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  u.r2c1.real*re01 - u.r2c1.imag*im01 +</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  u.r2c2.real*re10 - u.r2c2.imag*im10 +</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  u.r2c3.real*re11 - u.r2c3.imag*im11;</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  imVec[ind10] =</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  u.r2c0.imag*re00 + u.r2c0.real*im00 +</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  u.r2c1.imag*re01 + u.r2c1.real*im01 +</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  u.r2c2.imag*re10 + u.r2c2.real*im10 +</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  u.r2c3.imag*re11 + u.r2c3.real*im11; </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>  reVec[ind11] = </div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  u.r3c0.real*re00 - u.r3c0.imag*im00 +</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  u.r3c1.real*re01 - u.r3c1.imag*im01 +</div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  u.r3c2.real*re10 - u.r3c2.imag*im10 +</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  u.r3c3.real*re11 - u.r3c3.imag*im11;</div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  imVec[ind11] =</div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  u.r3c0.imag*re00 + u.r3c0.real*im00 +</div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  u.r3c1.imag*re01 + u.r3c1.real*im01 +</div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  u.r3c2.imag*re10 + u.r3c2.real*im10 +</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  u.r3c3.imag*re11 + u.r3c3.real*im11; </div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a7ec46b4b96cda399095a2488ceff69b6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7ec46b4b96cda399095a2488ceff69b6">◆ </a></span>statevec_multiControlledUnitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledUnitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlQubitsMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlFlipMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01183">1183</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  {</div>
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <span class="keywordtype">int</span> threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</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="l01190"></a><span class="lineno"> 1190</span>  statevec_multiControlledUnitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  qureg, ctrlQubitsMask, ctrlFlipMask, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00372">multiControlledUnitary()</a>, and <a class="el" href="QuEST_8c_source.html#l00387">multiStateControlledUnitary()</a>.</p>
</div>
</div>
<a id="a6fb74f09125cd2ce2658824182248c6e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6fb74f09125cd2ce2658824182248c6e">◆ </a></span>statevec_multiControlledUnitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiControlledUnitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlQubitsMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlFlipMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix2 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01123">1123</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  {</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</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="l01130"></a><span class="lineno"> 1130</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</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="l01133"></a><span class="lineno"> 1133</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  </div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</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="l01137"></a><span class="lineno"> 1137</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</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="l01140"></a><span class="lineno"> 1140</span>  <span class="keyword">const</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="l01141"></a><span class="lineno"> 1141</span>  </div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  </div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  </div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  </div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</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="l01152"></a><span class="lineno"> 1152</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="l01153"></a><span class="lineno"> 1153</span>  </div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  </div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  </div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  <span class="keywordflow">if</span> (ctrlQubitsMask == (ctrlQubitsMask & (indexUp ^ ctrlFlipMask))) {</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  </div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  </div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*stateRealLo;</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  </div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  }</div>
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a8d88b4ed94ab024e5e7b2f1f4f505b44"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8d88b4ed94ab024e5e7b2f1f4f505b44">◆ </a></span>statevec_multiRotateZ()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiRotateZ </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>angle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01466">1466</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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> cosAngle = cos(angle/2.0);</div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> sinAngle = sin(angle/2.0);</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  </div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</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="l01474"></a><span class="lineno"> 1474</span>  statevec_multiRotateZKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, mask, cosAngle, sinAngle);</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00624">multiRotateZ()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00410">statevec_multiRotatePauli()</a>.</p>
</div>
</div>
<a id="a754e4531aa159461177751dd12e988ed"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a754e4531aa159461177751dd12e988ed">◆ </a></span>statevec_multiRotateZKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_multiRotateZKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01449">1449</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  {</div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  </div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</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="l01452"></a><span class="lineno"> 1452</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="l01453"></a><span class="lineno"> 1453</span>  <span class="keywordflow">if</span> (index>=stateVecSize) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  </div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</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="l01456"></a><span class="lineno"> 1456</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="l01457"></a><span class="lineno"> 1457</span>  </div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</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="l01459"></a><span class="lineno"> 1459</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateReal = stateVecReal[index];</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateImag = stateVecImag[index];</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>  stateVecReal[index] = cosAngle*stateReal + fac * sinAngle*stateImag;</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  stateVecImag[index] = - fac * sinAngle*stateReal + cosAngle*stateImag; </div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00086">getBitMaskParity()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="abdb6e0ee1e407755e1b944086cedd90e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abdb6e0ee1e407755e1b944086cedd90e">◆ </a></span>statevec_pauliX()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliX </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01238">1238</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> {</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</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="l01243"></a><span class="lineno"> 1243</span>  statevec_pauliXKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit);</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00431">pauliX()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00450">statevec_applyPauliProd()</a>.</p>
</div>
</div>
<a id="ab1662a828dc725610a71168a58430fae"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab1662a828dc725610a71168a58430fae">◆ </a></span>statevec_pauliXKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_pauliXKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01194">1194</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  {</div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</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="l01197"></a><span class="lineno"> 1197</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</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="l01200"></a><span class="lineno"> 1200</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  </div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</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="l01204"></a><span class="lineno"> 1204</span>  stateImagUp; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</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="l01207"></a><span class="lineno"> 1207</span>  <span class="keyword">const</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="l01208"></a><span class="lineno"> 1208</span>  </div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  </div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  </div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</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="l01218"></a><span class="lineno"> 1218</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="l01219"></a><span class="lineno"> 1219</span>  </div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  </div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  </div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  </div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  </div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a73b56fbac6e464a37805fa9d9657a8f9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a73b56fbac6e464a37805fa9d9657a8f9">◆ </a></span>statevec_pauliY()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliY </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01271">1271</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span> {</div>
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</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="l01276"></a><span class="lineno"> 1276</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, 1);</div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00442">pauliY()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00450">statevec_applyPauliProd()</a>.</p>
</div>
</div>
<a id="aee97816cfabeea7874cd837a8d105412"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aee97816cfabeea7874cd837a8d105412">◆ </a></span>statevec_pauliYConj()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliYConj </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01279">1279</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> {</div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</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="l01284"></a><span class="lineno"> 1284</span>  statevec_pauliYKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, -1);</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00442">pauliY()</a>.</p>
</div>
</div>
<a id="a1f5b1f46708a7c96275e379b873ba2f6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1f5b1f46708a7c96275e379b873ba2f6">◆ </a></span>statevec_pauliYKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_pauliYKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>conjFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01246">1246</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  {</div>
<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  </div>
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</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="l01249"></a><span class="lineno"> 1249</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="l01250"></a><span class="lineno"> 1250</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="l01251"></a><span class="lineno"> 1251</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="l01252"></a><span class="lineno"> 1252</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</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 = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</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="l01256"></a><span class="lineno"> 1256</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="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp, stateImagUp;</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  </div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</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="l01260"></a><span class="lineno"> 1260</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="l01261"></a><span class="lineno"> 1261</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  stateImagUp = stateVecImag[indexUp];</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>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a8972669148af60d7e1c09687f69673d4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8972669148af60d7e1c09687f69673d4">◆ </a></span>statevec_phaseShiftByTerm()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_phaseShiftByTerm </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>term</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01369">1369</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span> { </div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</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="l01372"></a><span class="lineno"> 1372</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="l01373"></a><span class="lineno"> 1373</span>  </div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</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="l01377"></a><span class="lineno"> 1377</span>  statevec_phaseShiftByTermKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, cosAngle, sinAngle);</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__common_8c_source.html#l00257">statevec_pauliZ()</a>, <a class="el" href="QuEST__common_8c_source.html#l00250">statevec_phaseShift()</a>, <a class="el" href="QuEST__common_8c_source.html#l00264">statevec_sGate()</a>, <a class="el" href="QuEST__common_8c_source.html#l00278">statevec_sGateConj()</a>, <a class="el" href="QuEST__common_8c_source.html#l00271">statevec_tGate()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00285">statevec_tGateConj()</a>.</p>
</div>
</div>
<a id="a5ef71ca3bb26774d7317253128a4aeab"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5ef71ca3bb26774d7317253128a4aeab">◆ </a></span>statevec_phaseShiftByTermKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_phaseShiftByTermKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>cosAngle</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>sinAngle</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01341">1341</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><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>  </div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</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="l01345"></a><span class="lineno"> 1345</span>  </div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealLo, stateImagLo; </div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="keyword">const</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="l01349"></a><span class="lineno"> 1349</span>  </div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  sizeHalfBlock = 1LL << targetQubit;</div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  sizeBlock = 2LL * sizeHalfBlock;</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>  <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="l01354"></a><span class="lineno"> 1354</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="l01355"></a><span class="lineno"> 1355</span>  </div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  indexLo = indexUp + sizeHalfBlock;</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>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  </div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  stateVecReal[indexLo] = cosAngle*stateRealLo - sinAngle*stateImagLo;</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  stateVecImag[indexLo] = sinAngle*stateRealLo + cosAngle*stateImagLo;</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a1e57230c7995447039e62a84c0a36524"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1e57230c7995447039e62a84c0a36524">◆ </a></span>statevec_reportStateToScreen()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_reportStateToScreen </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQuESTEnv.html">QuESTEnv</a> </td>
<td class="paramname"><em>env</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>reportRank</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Print the current state vector of probability amplitudes for a set of qubits to standard out. </p>
<p>For debugging purposes. Each rank should print output serially. Only print output for systems <= 5 qubits </p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00421">421</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  {</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordtype">int</span> rank;</div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <a class="code" href="group__debug.html#ga924ef2dbda6b733b4041270077c76ece">copyStateFromGPU</a>(qureg); </div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#a0a86e8a50ea8c998b4a0a6640c5a1218">numQubitsInStateVec</a><=5){</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</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="l00427"></a><span class="lineno"> 427</span>  <span class="keywordflow">if</span> (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>==rank){</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">if</span> (reportRank) {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</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="l00430"></a><span class="lineno"> 430</span>  <span class="comment">//printf("\trank, index, real, imag\n");</span></div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rank==0) {</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  printf(<span class="stringliteral">"Reporting state [\n"</span>);</div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  printf(<span class="stringliteral">"real, imag\n"</span>);</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>  </div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</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="l00438"></a><span class="lineno"> 438</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="l00439"></a><span class="lineno"> 439</span>  }</div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</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="l00441"></a><span class="lineno"> 441</span>  }</div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <a class="code" href="group__debug.html#ga8d31fe2d1ad4d01e2a1f5f6b8bc15b77">syncQuESTEnv</a>(env);</div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  }</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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00174">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00407">copyStateFromGPU()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00176">Qureg::numChunks</a>, <a class="el" href="QuEST_8h_source.html#l00167">Qureg::numQubitsInStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00179">Qureg::stateVec</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l00369">syncQuESTEnv()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l01073">reportStateToScreen()</a>.</p>
</div>
</div>
<a id="aa121d55f2ca09c06a96ddcd433c60b0f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa121d55f2ca09c06a96ddcd433c60b0f">◆ </a></span>statevec_setAmps()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_setAmps </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>startInd</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>reals</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>imags</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>numAmps</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00153">153</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  {</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>.real)), </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><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00155">initStateFromAmps()</a>, <a class="el" href="QuEST_8c_source.html#l00779">setAmps()</a>, and <a class="el" href="QuEST_8c_source.html#l00788">setDensityAmps()</a>.</p>
</div>
</div>
<a id="ad64a23933361fafc1b6b1787759c2663"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad64a23933361fafc1b6b1787759c2663">◆ </a></span>statevec_setWeightedQureg()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_setWeightedQureg </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>facOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>out</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02850">2850</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  {</div>
<div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  </div>
<div class="line"><a name="l02852"></a><span class="lineno"> 2852</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="l02853"></a><span class="lineno"> 2853</span>  </div>
<div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>  CUDABlocks = ceil(numAmpsToVisit / (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>) threadsPerCUDABlock);</div>
<div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>  statevec_setWeightedQuregKernel<<<CUDABlocks, threadsPerCUDABlock>>>(</div>
<div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>  fac1, qureg1, fac2, qureg2, facOut, out</div>
<div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>  );</div>
<div class="line"><a name="l02860"></a><span class="lineno"> 2860</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00795">setWeightedQureg()</a>, and <a class="el" href="QuEST__common_8c_source.html#l00493">statevec_applyPauliSum()</a>.</p>
</div>
</div>
<a id="a040a1c670457b4b5789c089a3d32bf8f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a040a1c670457b4b5789c089a3d32bf8f">◆ </a></span>statevec_setWeightedQuregKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_setWeightedQuregKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>fac2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>facOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>out</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l02818">2818</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  {</div>
<div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  </div>
<div class="line"><a name="l02820"></a><span class="lineno"> 2820</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="l02821"></a><span class="lineno"> 2821</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="l02822"></a><span class="lineno"> 2822</span>  <span class="keywordflow">if</span> (ampInd >= numAmpsToVisit) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  </div>
<div class="line"><a name="l02824"></a><span class="lineno"> 2824</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="l02825"></a><span class="lineno"> 2825</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="l02826"></a><span class="lineno"> 2826</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="l02827"></a><span class="lineno"> 2827</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="l02828"></a><span class="lineno"> 2828</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="l02829"></a><span class="lineno"> 2829</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="l02830"></a><span class="lineno"> 2830</span>  </div>
<div class="line"><a name="l02831"></a><span class="lineno"> 2831</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="l02832"></a><span class="lineno"> 2832</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="l02833"></a><span class="lineno"> 2833</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="l02834"></a><span class="lineno"> 2834</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="l02835"></a><span class="lineno"> 2835</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="l02836"></a><span class="lineno"> 2836</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="l02837"></a><span class="lineno"> 2837</span>  </div>
<div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re1,im1, re2,im2, reOut,imOut;</div>
<div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index = ampInd;</div>
<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  </div>
<div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  re1 = vecRe1[index]; im1 = vecIm1[index];</div>
<div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  re2 = vecRe2[index]; im2 = vecIm2[index];</div>
<div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>  reOut = vecReOut[index];</div>
<div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>  imOut = vecImOut[index];</div>
<div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>  </div>
<div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  vecReOut[index] = (facReOut*reOut - facImOut*imOut) + (facRe1*re1 - facIm1*im1) + (facRe2*re2 - facIm2*im2);</div>
<div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  vecImOut[index] = (facReOut*imOut + facImOut*reOut) + (facRe1*im1 + facIm1*re1) + (facRe2*im2 + facIm2*re2);</div>
<div class="line"><a name="l02848"></a><span class="lineno"> 2848</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
</div>
</div>
<a id="ab7478fcaf6357ab202d72853b672e375"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab7478fcaf6357ab202d72853b672e375">◆ </a></span>statevec_swapQubitAmps()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_swapQubitAmps </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01613">1613</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> {</div>
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</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="l01618"></a><span class="lineno"> 1618</span>  statevec_swapQubitAmpsKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, qb1, qb2);</div>
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00599">swapGate()</a>.</p>
</div>
</div>
<a id="a89a450a1932e4f4f94cf1487af9d263b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a89a450a1932e4f4f94cf1487af9d263b">◆ </a></span>statevec_swapQubitAmpsKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_swapQubitAmpsKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01587">1587</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  {</div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  </div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</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="l01590"></a><span class="lineno"> 1590</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="l01591"></a><span class="lineno"> 1591</span>  </div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</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="l01593"></a><span class="lineno"> 1593</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="l01594"></a><span class="lineno"> 1594</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  </div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</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="l01597"></a><span class="lineno"> 1597</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re01, re10, im01, im10;</div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  </div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  <span class="comment">// determine ind00 of |..0..0..>, |..0..1..> and |..1..0..></span></div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a>(thisTask, qb1, qb2);</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, qb1);</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a>(ind00, qb2);</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  </div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  </div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="comment">// swap 01 and 10 amps</span></div>
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  reVec[ind01] = re10; reVec[ind10] = re01;</div>
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  imVec[ind01] = im10; imVec[ind10] = im01;</div>
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a4bea7ed7967083cbabd8a8e5acdd48c0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4bea7ed7967083cbabd8a8e5acdd48c0">◆ </a></span>statevec_unitary()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_unitary </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00850">850</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00851"></a><span class="lineno"> 851</span> {</div>
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="keywordtype">int</span> threadsPerCUDABlock, CUDABlocks;</div>
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  threadsPerCUDABlock = 128;</div>
<div class="line"><a name="l00854"></a><span class="lineno"> 854</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="l00855"></a><span class="lineno"> 855</span>  statevec_unitaryKernel<<<CUDABlocks, threadsPerCUDABlock>>>(qureg, targetQubit, argifyMatrix2(u));</div>
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST_8c_source.html#l00347">unitary()</a>.</p>
</div>
</div>
<a id="ab2ade4284b49f76631d51845ae54abdb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab2ade4284b49f76631d51845ae54abdb">◆ </a></span>statevec_unitaryKernel()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">__global__ void statevec_unitaryKernel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ArgMatrix2 </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>fix – no necessary for GPU version</p>
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l00797">797</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  {</div>
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l00799"></a><span class="lineno"> 799</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="l00800"></a><span class="lineno"> 800</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="comment">// ----- indices</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> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  </div>
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00806"></a><span class="lineno"> 806</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="l00807"></a><span class="lineno"> 807</span>  stateImagUp,stateImagLo; <span class="comment">// (used in updates)</span></div>
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l00809"></a><span class="lineno"> 809</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="l00810"></a><span class="lineno"> 810</span>  <span class="keyword">const</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="l00811"></a><span class="lineno"> 811</span>  </div>
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  sizeHalfBlock = 1LL << targetQubit; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  </div>
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="comment">// rotate //</span></div>
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  </div>
<div class="line"><a name="l00820"></a><span class="lineno"> 820</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="l00821"></a><span class="lineno"> 821</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="l00822"></a><span class="lineno"> 822</span>  </div>
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  thisTask = blockIdx.x*blockDim.x + threadIdx.x;</div>
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keywordflow">if</span> (thisTask>=numTasks) <span class="keywordflow">return</span>;</div>
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  </div>
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  </div>
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  </div>
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  stateImagLo = stateVecImag[indexLo];</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[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  stateVecReal[indexUp] = u.r0c0.real*stateRealUp - u.r0c0.imag*stateImagUp </div>
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  + u.r0c1.real*stateRealLo - u.r0c1.imag*stateImagLo;</div>
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  stateVecImag[indexUp] = u.r0c0.real*stateImagUp + u.r0c0.imag*stateRealUp </div>
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  + u.r0c1.real*stateImagLo + u.r0c1.imag*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>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  stateVecReal[indexLo] = u.r1c0.real*stateRealUp - u.r1c0.imag*stateImagUp </div>
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  + u.r1c1.real*stateRealLo - u.r1c1.imag*stateImagLo;</div>
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  stateVecImag[indexLo] = u.r1c0.real*stateImagUp + u.r1c0.imag*stateRealUp </div>
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  + u.r1c1.real*stateImagLo + u.r1c1.imag*stateRealLo;</div>
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00184">Qureg::deviceStateVec</a>, <a class="el" href="QuEST_8h_source.html#l00170">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
</div>
</div>
<a id="a31772904f024efd8d75a022e84c8207b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a31772904f024efd8d75a022e84c8207b">◆ </a></span>swapDouble()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void swapDouble </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> ** </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> ** </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__gpu_8cu_source.html#l01857">1857</a> of file <a class="el" href="QuEST__gpu_8cu_source.html">QuEST_gpu.cu</a>.</p>
<div class="fragment"><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  {</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *temp;</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  temp = *a;</div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  *a = *b;</div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  *b = temp;</div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__gpu_8cu_source.html#l02194">densmatr_calcFidelity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02268">densmatr_calcHilbertSchmidtDistance()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01988">densmatr_calcInnerProduct()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02339">densmatr_calcPurity()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l01864">densmatr_findProbabilityOfZero()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l02068">statevec_calcInnerProduct()</a>, and <a class="el" href="QuEST__gpu_8cu_source.html#l01912">statevec_findProbabilityOfZero()</a>.</p>
</div>
</div>
</div><!-- contents -->
<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#l01725">QuEST_gpu.cu:1725</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#l00407">QuEST_gpu.cu:407</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#l00369">QuEST_gpu.cu:369</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#l00201">QuEST.h:201</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#l01751">QuEST_gpu.cu:1751</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#l01857">QuEST_gpu.cu:1857</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#l00181">QuEST.h:181</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#l00176">QuEST.h:176</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5f14823d1125e973c4b350bd6ac84552"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5f14823d1125e973c4b350bd6ac84552">insertZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBits(long long int number, int *inds, 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_a303c00c3329a7bf290b68468735b4a8f"><div class="ttname"><a href="QuEST__gpu_8cu.html#a303c00c3329a7bf290b68468735b4a8f">densmatr_oneQubitDegradeOffDiagonal</a></div><div class="ttdeci">void densmatr_oneQubitDegradeOffDiagonal(Qureg qureg, const int targetQubit, qreal dephFac)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02554">QuEST_gpu.cu:2554</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5cb8662afc6c644a46f7339c89bfd226"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5cb8662afc6c644a46f7339c89bfd226">extractBit</a></div><div class="ttdeci">__forceinline__ __device__ int extractBit(int locationOfBitFromRight, 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="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#l00184">QuEST.h:184</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="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#l00167">QuEST.h:167</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_afbb044d76bf22d5c81a2a70a977f29bc"><div class="ttname"><a href="QuEST__gpu_8cu.html#afbb044d76bf22d5c81a2a70a977f29bc">densmatr_findProbabilityOfZero</a></div><div class="ttdeci">qreal densmatr_findProbabilityOfZero(Qureg qureg, const int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01864">QuEST_gpu.cu:1864</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a60b4893613de0cd6595f60cdec24999a"><div class="ttname"><a href="QuEST__gpu_8cu.html#a60b4893613de0cd6595f60cdec24999a">insertTwoZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertTwoZeroBits(long long int number, int bit1, 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__common_8c_html_abd1285091450c7c2806cc26c71eb5df2"><div class="ttname"><a href="QuEST__common_8c.html#abd1285091450c7c2806cc26c71eb5df2">getQubitBitMask</a></div><div class="ttdeci">long long int getQubitBitMask(int *qubits, const int numQubits)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__common_8c_source.html#l00043">QuEST_common.c:43</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#l00174">QuEST.h:174</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#l00170">QuEST.h:170</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#l00397">QuEST_gpu.cu:397</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="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#l00202">QuEST.h:202</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#l00139">QuEST.h:139</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#l00186">QuEST.h:186</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a6aea6cf9c06d05a5765ad01311531627"><div class="ttname"><a href="QuEST__gpu_8cu.html#a6aea6cf9c06d05a5765ad01311531627">flipBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int flipBit(long long int number, 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_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#l02613">QuEST_gpu.cu:2613</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#l00140">QuEST.h:140</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#l00179">QuEST.h:179</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#l00163">QuEST.h:163</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#l00138">QuEST.h:138</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a067da9fba487d5821fbd689718b19de2"><div class="ttname"><a href="QuEST__gpu_8cu.html#a067da9fba487d5821fbd689718b19de2">statevec_findProbabilityOfZero</a></div><div class="ttdeci">qreal statevec_findProbabilityOfZero(Qureg qureg, const int measureQubit)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l01912">QuEST_gpu.cu:1912</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#l00165">QuEST.h:165</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#l00172">QuEST.h:172</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#l01732">QuEST_gpu.cu:1732</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_a4536acc227ff24e63aaf47b2b42e765f"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4536acc227ff24e63aaf47b2b42e765f">insertZeroBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBit(long long int number, 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="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="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#l00186">QuEST.h:186</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a515b6a920b1715d4eae25dcf29f39b95"><div class="ttname"><a href="QuEST__gpu_8cu.html#a515b6a920b1715d4eae25dcf29f39b95">densmatr_mixDephasing</a></div><div class="ttdeci">void densmatr_mixDephasing(Qureg qureg, const int targetQubit, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l02574">QuEST_gpu.cu:2574</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>