summaryrefslogtreecommitdiff
path: root/1
diff options
context:
space:
mode:
Diffstat (limited to '1')
-rw-r--r--1/input200
-rw-r--r--1/part1.c38
-rw-r--r--1/part1.f9025
-rw-r--r--1/part2.c40
-rw-r--r--1/part2.f9027
-rw-r--r--1/part2_fast.c127
-rw-r--r--1/repair_avx.asm21
7 files changed, 0 insertions, 478 deletions
diff --git a/1/input b/1/input
deleted file mode 100644
index 2de45cc..0000000
--- a/1/input
+++ /dev/null
@@ -1,200 +0,0 @@
-1779
-1737
-1537
-1167
-1804
-1873
-1894
-1446
-1262
-1608
-1430
-1421
-1826
-1718
-1888
-1314
-1844
-248
-1812
-1627
-1605
-1641
-1126
-1051
-1839
-1067
-1685
-1800
-1383
-1415
-1781
-1372
-1711
-1687
-1357
-1603
-1899
-1856
-1240
-1872
-1483
-1624
-1358
-1168
-1238
-1585
-1159
-1409
-1615
-1258
-1412
-1468
-1912
-1840
-1681
-1700
-1031
-1757
-1911
-1096
-1239
-1331
-1881
-1304
-1694
-1705
-1680
-820
-1744
-1245
-1922
-1545
-1335
-1852
-1318
-1565
-1505
-1535
-1536
-1758
-1508
-1453
-1957
-1375
-1647
-1531
-1261
-1202
-1701
-1562
-1933
-1293
-1828
-334
-1714
-1931
-1385
-1294
-1469
-1629
-1842
-1730
-1534
-1544
-1946
-1805
-1188
-1684
-1875
-1623
-1248
-1347
-2006
-1191
-1037
-1387
-1903
-1746
-16
-952
-1246
-384
-1518
-1738
-1269
-1747
-1423
-1764
-1666
-1999
-1776
-1673
-1350
-1698
-2004
-1235
-1719
-1131
-1671
-1334
-1556
-1299
-1569
-1523
-1655
-1189
-1023
-1264
-1821
-1639
-1114
-1391
-1154
-1225
-1906
-1481
-1728
-1309
-1682
-1662
-1017
-1952
-1948
-2010
-1809
-1394
-1039
-1493
-1509
-1628
-1401
-1515
-1497
-1164
-1829
-1452
-1706
-1919
-1831
-1643
-1849
-1558
-1162
-1328
-1432
-680
-1169
-1393
-1646
-1161
-1104
-1678
-1477
-1824
-1353
-1260
-1736
-1777
-1658
-1715
diff --git a/1/part1.c b/1/part1.c
deleted file mode 100644
index 1b825df..0000000
--- a/1/part1.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define INPUT_LEN 200
-
-int repair(const int * arr)
-{
- for (int i = 0; i < INPUT_LEN; i++) {
- for (int j = 0; j < INPUT_LEN; j++) {
- if (arr[i] + arr[j] == 2020) {
- return arr[i] * arr[j];
- }
- }
- }
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- FILE *file = fopen(argv[argc - 1], "r");
- if (!file) {
- return 1;
- }
-
- char buffer[8] = { 0 };
- int input[INPUT_LEN] = { 0 };
- for (int i = 0; i < 200; i++) {
- fgets(buffer, 8, file);
- input[i] = atoi(buffer);
- }
-
- fclose(file);
-
- printf("%i", repair(input));
-}
diff --git a/1/part1.f90 b/1/part1.f90
deleted file mode 100644
index a7c09c8..0000000
--- a/1/part1.f90
+++ /dev/null
@@ -1,25 +0,0 @@
-program day1
- implicit none
-
- integer, parameter :: input_len = 200
- integer, parameter :: search = 2020
-
- integer :: i, j
- integer, dimension(input_len) :: input
-
- open(10, file='input', status='old')
- do i = 1, input_len
- read(10, *) input(i)
- end do
- close(10)
-
- do i = 1, input_len
- do j = 1, input_len
- if (input(i) + input(j) == search) then
- print *, input(i) * input(j)
- stop
- end if
- end do
- end do
-
-end program day1
diff --git a/1/part2.c b/1/part2.c
deleted file mode 100644
index 9c10b61..0000000
--- a/1/part2.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define INPUT_LEN 200
-
-int repair(const int *arr)
-{
- for (int i = 0; i < INPUT_LEN; i++) {
- for (int j = 0; j < INPUT_LEN; j++) {
- for (int k = 0; k < INPUT_LEN; k++) {
- if (arr[i] + arr[j] + arr[k] == 2020) {
- return arr[i] * arr[j] * arr[k];
- }
- }
- }
- }
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- FILE *file = fopen(argv[argc - 1], "r");
- if (!file) {
- return 1;
- }
-
- char buffer[8] = { 0 };
- int input[INPUT_LEN] = { 0 };
- for (int i = 0; i < 200; i++) {
- fgets(buffer, 8, file);
- input[i] = atoi(buffer);
- }
-
- fclose(file);
-
- printf("%i", repair(input));
-}
diff --git a/1/part2.f90 b/1/part2.f90
deleted file mode 100644
index b3d6bd2..0000000
--- a/1/part2.f90
+++ /dev/null
@@ -1,27 +0,0 @@
-program day1
- implicit none
-
- integer, parameter :: input_len = 200
- integer, parameter :: search = 2020
-
- integer :: i, j, k
- integer, dimension(input_len) :: input
-
- open(10, file='input', status='old')
- do i = 1, input_len
- read(10, *) input(i)
- end do
- close(10)
-
- do i = 1, input_len
- do j = 1, input_len
- do k = 1, input_len
- if (input(i) + input(j) + input(k) == search) then
- print *, input(i) * input(j) * input(k)
- stop
- end if
- end do
- end do
- end do
-
-end program day1
diff --git a/1/part2_fast.c b/1/part2_fast.c
deleted file mode 100644
index c32f881..0000000
--- a/1/part2_fast.c
+++ /dev/null
@@ -1,127 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <immintrin.h>
-
-#define INPUT_LEN 200
-#define SEARCH 2020
-
-#ifdef USE_ASM
-int repair_avx_inner(const int *arr, __m256i search);
-#else
-int repair_avx_inner(const int *arr, __m256i search)
-{
- for (int k = 0; k < INPUT_LEN; k += 8) {
- __m256i new = _mm256_loadu_si256((__m256i *)(&arr[k]));
- if (_mm256_movemask_epi8(_mm256_cmpeq_epi32(new, search))) {
- return _mm256_extract_epi32(search, 0);
- }
- }
-
- return 0;
-}
-#endif
-
-int repair_avx(const int *arr)
-{
- __m256i search = _mm256_set1_epi32(SEARCH);
- for (int i = 0; i < INPUT_LEN; i++) {
- __m256i start = _mm256_set1_epi32(arr[i]);
- for (int j = 0; j < INPUT_LEN; j += 8) {
- __m256i new = _mm256_loadu_si256((__m256i *)(&arr[j]));
- new = _mm256_add_epi32(start, new);
- unsigned int mask = (unsigned int)_mm256_movemask_epi8(_mm256_cmpgt_epi32(new, search));
- if (mask == 0xffffffff) {
- continue;
- }
-
- switch (__lzcnt32(mask) / 4) {
- case 0:
- {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(7)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 7];
- }
- }
- case 1:
- if ((mask & 0x0f000000) == 0) {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(6)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 6];
- }
- }
- case 2:
- if ((mask & 0x00f00000) == 0 ){
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(5)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 5];
- }
- }
- case 3:
- if ((mask & 0x000f0000) == 0) {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(4)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 4];
- }
- }
- case 4:
- if ((mask & 0x0000f000) == 0) {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(3)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 3];
- }
- }
- case 5:
- if ((mask & 0x00000f00) == 0) {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(2)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 2];
- }
- }
- case 6:
- if ((mask & 0x000000f0) == 0) {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_set1_epi32(1)));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j + 1];
- }
- }
- case 7:
- if ((mask & 0x0000000f) == 0) {
- __m256i cmp = _mm256_sub_epi32(search, _mm256_permutevar8x32_epi32(new, _mm256_setzero_si256()));
- int tmp = repair_avx_inner(arr, cmp);
- if (tmp) {
- return tmp * arr[i] * arr[j];
- }
- }
- }
- }
- }
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- FILE *file = fopen(argv[argc - 1], "r");
- if (!file) {
- return 1;
- }
-
- char buffer[8] = { 0 };
- int input[INPUT_LEN] = { 0 };
- for (int i = 0; i < 200; i++) {
- fgets(buffer, 8, file);
- input[i] = atoi(buffer);
- }
-
- fclose(file);
-
- printf("%i\n", repair_avx(input));
-}
diff --git a/1/repair_avx.asm b/1/repair_avx.asm
deleted file mode 100644
index 4f128f6..0000000
--- a/1/repair_avx.asm
+++ /dev/null
@@ -1,21 +0,0 @@
-global repair_avx_inner
-
-section .text
-
-repair_avx_inner:
-%assign i 0
-%rep 25
- vpcmpeqd ymm1, ymm0, [rdi + i]
-; vptest ymm1, ymm1 ; slower then vpmovmskb + test
- vpmovmskb eax, ymm1
- test eax, eax
- jne .found
-%assign i i+32
-%endrep
- xor eax, eax ; not found, return 0
- vzeroupper ; eliminate performance penalties caused by false dependencies when transitioning between AVX and legacy SSE instructions
- ret
-.found:
- vzeroupper ; eliminate performance penalties caused by false dependencies when transitioning between AVX and legacy SSE instructions
- movd eax, xmm0 ; smaller then putting a vmovd before the vzeroupper and no measurable performance difference
- ret