421 {
422
423 SECTION( LABEL_CORRECTNESS ) {
424
426
427 for (auto [deployLabel, mpi, gpu, omp] : getSupportedDeployments()) {
428
429 int isDenseMatr = GENERATE( 0, 1 );
430
431 std::string quregLabel = (isDenseMatr)? LABEL_STATEVEC : LABEL_DENSMATR;
432 std::string secLabel = quregLabel + LABEL_DELIMITER + deployLabel;
433
434 SECTION( secLabel ) {
435
436 int minNumQubits = std::max({1, mpi? getLog2(env.numNodes) : 1});
437 int maxNumQubits = std::min({minNumQubits + 3, isDenseMatr? 6 : 12});
438 int numQubits = GENERATE_COPY( range(minNumQubits, maxNumQubits) );
439 CAPTURE( numQubits );
440
442
443
444 REQUIRE( qureg.numQubits == numQubits );
445 REQUIRE( qureg.isDensityMatrix == isDenseMatr );
446 REQUIRE( qureg.numAmps == getPow2(numQubits * (isDenseMatr? 2:1)) );
447 REQUIRE( qureg.logNumNodes == getLog2(qureg.numNodes) );
448 REQUIRE( qureg.logNumAmps == getLog2(qureg.numAmps) );
449 REQUIRE( qureg.logNumAmpsPerNode == getLog2(qureg.numAmpsPerNode) );
450 REQUIRE( qureg.logNumColsPerNode == (isDenseMatr? getLog2(getPow2(numQubits) / qureg.numNodes) : 0) );
451
452
453 REQUIRE( qureg.isMultithreaded == omp );
454 REQUIRE( qureg.isGpuAccelerated == gpu );
455 REQUIRE( (qureg.isDistributed == mpi || env.numNodes == 1) );
456
457
458 if (mpi) {
459 REQUIRE( qureg.rank == env.rank );
460 REQUIRE( qureg.numNodes == env.numNodes );
461 REQUIRE( qureg.numAmpsPerNode == qureg.numAmps / env.numNodes );
462 } else {
463 REQUIRE( qureg.rank == 0 );
464 REQUIRE( qureg.numNodes == 1 );
465 REQUIRE( qureg.numAmpsPerNode == qureg.numAmps );
466 }
467
468
469 REQUIRE( qureg.cpuAmps != nullptr );
470 if (qureg.isGpuAccelerated)
471 REQUIRE( qureg.gpuAmps != nullptr );
472 if (qureg.isDistributed)
473 REQUIRE( qureg.cpuCommBuffer != nullptr );
474 if (qureg.isGpuAccelerated && qureg.isDistributed)
475 REQUIRE( qureg.gpuCommBuffer != nullptr );
476
477
478 if (isDenseMatr) {
479 qmatrix ref =
getZeroMatrix(getPow2(numQubits)); ref[0][0] = 1;
480 REQUIRE_AGREE( qureg, ref );
481 } else {
482 qvector ref = getZeroVector(getPow2(numQubits)); ref[0] = 1;
483 REQUIRE_AGREE( qureg, ref );
484 }
485
487 }
488 }
489 }
490
491 SECTION( LABEL_VALIDATION ) {
492
493 SECTION( "env not initialised" ) {
494
495
496 SUCCEED( );
497 }
498
499 SECTION( "invalid isDensityMatrix flag" ) {
500
501 int isDensMatr = GENERATE( -1, 2 );
502
503 REQUIRE_THROWS_WITH(
createCustomQureg(10, isDensMatr, 0,0,0), ContainsSubstring(
"isDensityMatrix") );
504 }
505
506 SECTION( "unsupported deployment" ) {
507
509 const int numQubits = 10;
510 const int isDensMatr = 0;
511
512 if (!env.isDistributed)
513 REQUIRE_THROWS_WITH(
createCustomQureg(numQubits,isDensMatr, 1,0,0), ContainsSubstring(
"non-distributed") );
514
515 if (!env.isGpuAccelerated)
516 REQUIRE_THROWS_WITH(
createCustomQureg(numQubits,isDensMatr, 0,1,0), ContainsSubstring(
"non-GPU") );
517
518 if (!env.isMultithreaded)
519 REQUIRE_THROWS_WITH(
createCustomQureg(numQubits,isDensMatr, 0,0,1), ContainsSubstring(
"non-multithreaded") );
520 }
521
522 SECTION( "too few qubits" ) {
523
524 REQUIRE_THROWS_WITH(
createCustomQureg(-1, 0,0,0,0), ContainsSubstring(
"must contain one or more qubits") );
525 REQUIRE_THROWS_WITH(
createCustomQureg(+0, 0,0,0,0), ContainsSubstring(
"must contain one or more qubits") );
526
528 if (numNodes > 2) {
529 int minNumQubits = getLog2(numNodes);
530 int useDistrib = 1;
531 REQUIRE_THROWS_WITH(
createCustomQureg(minNumQubits-1,0, useDistrib,0,0), ContainsSubstring(
"each node would contain fewer than one amplitude") );
532 }
533 }
534
535 SECTION( "too many qubits" ) {
536
537
538 REQUIRE_THROWS_WITH(
createCustomQureg(100, 0, 0,0,0), ContainsSubstring(
"qindex") );
539 REQUIRE_THROWS_WITH(
createCustomQureg(50, 1, 0,0,0), ContainsSubstring(
"qindex") );
540
541
542 REQUIRE_THROWS_WITH(
createCustomQureg(62, 0, 0,0,0), ContainsSubstring(
"memory would overflow size_t") );
543 REQUIRE_THROWS_WITH(
createCustomQureg(31, 1, 0,0,0), ContainsSubstring(
"memory would overflow size_t") );
544
545
546
547
548
549 #ifndef SANITIZER_IS_ACTIVE
551 ContainsSubstring("failed") ||
552 ContainsSubstring("insufficient available memory") ||
553 ContainsSubstring("available GPU memory") ||
554 ContainsSubstring("RAM") );
556 ContainsSubstring("failed") ||
557 ContainsSubstring("insufficient available memory") ||
558 ContainsSubstring("available GPU memory") ||
559 ContainsSubstring("RAM") );
560 #endif
561 }
562 }
563}
Qureg createCustomQureg(int numQubits, int isDensMatr, int useDistrib, int useGpuAccel, int useMultithread)
qmatrix getZeroMatrix(size_t dim)