aboutsummaryrefslogtreecommitdiff
path: root/tester/simd.c
blob: bea2f06c4155293a4e40e251950e1baf639da936 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>

#include "tests.h"

static const double R2 = 0.7071067811865476;

void run_simd_tests(void)
{
	psi_test_section("SIMD single-qubit kernels");

	printf("  detected: %s\n", psi_simd_name(psi_detect_simd()));

	struct PsiComplex h[2][2] = {
		{ psi_new_complex(R2, 0.0), psi_new_complex(R2, 0.0) },
		{ psi_new_complex(R2, 0.0), psi_new_complex(-R2, 0.0) },
	};

	struct PsiComplex two[4] = {
		psi_new_complex(1.0, 0.0),
		psi_new_complex(0.0, 0.0),
		psi_new_complex(0.0, 0.0),
		psi_new_complex(0.0, 0.0),
	};
	psi_apply_single_qubit_gate_simd(two, h, 0, 2);
	struct PsiComplex two_exp[] = {
		psi_new_complex(R2, 0.0),
		psi_new_complex(0.0, 0.0),
		psi_new_complex(R2, 0.0),
		psi_new_complex(0.0, 0.0),
	};
	psi_test_check(psi_amps_match(two, two_exp, 4), "SIMD H on q0 of |00>");

	struct PsiComplex three[8];
	for (size_t i = 0; i < 8; i++)
		three[i] = psi_new_complex(0.0, 0.0);
	three[0] = psi_new_complex(1.0, 0.0);
	psi_apply_single_qubit_gate_simd(three, h, 0, 3);
	struct PsiComplex three_exp[8];
	for (size_t i = 0; i < 8; i++)
		three_exp[i] = psi_new_complex(0.0, 0.0);
	three_exp[0] = psi_new_complex(R2, 0.0);
	three_exp[4] = psi_new_complex(R2, 0.0);
	psi_test_check(psi_amps_match(three, three_exp, 8), "SIMD H on q0 of |000> (chunked)");

	struct PsiComplex x[2][2] = {
		{ psi_new_complex(0.0, 0.0), psi_new_complex(1.0, 0.0) },
		{ psi_new_complex(1.0, 0.0), psi_new_complex(0.0, 0.0) },
	};
	struct PsiComplex flip[4] = {
		psi_new_complex(1.0, 0.0),
		psi_new_complex(0.0, 0.0),
		psi_new_complex(0.0, 0.0),
		psi_new_complex(0.0, 0.0),
	};
	psi_apply_single_qubit_gate_simd(flip, x, 1, 2);
	struct PsiComplex flip_exp[] = {
		psi_new_complex(0.0, 0.0),
		psi_new_complex(1.0, 0.0),
		psi_new_complex(0.0, 0.0),
		psi_new_complex(0.0, 0.0),
	};
	psi_test_check(psi_amps_match(flip, flip_exp, 4), "SIMD X on q1 of |00> = |01>");
}