diff options
Diffstat (limited to '1')
| -rw-r--r-- | 1/input | 200 | ||||
| -rw-r--r-- | 1/part1.c | 38 | ||||
| -rw-r--r-- | 1/part1.f90 | 25 | ||||
| -rw-r--r-- | 1/part2.c | 40 | ||||
| -rw-r--r-- | 1/part2.f90 | 27 | ||||
| -rw-r--r-- | 1/part2_fast.c | 127 | ||||
| -rw-r--r-- | 1/repair_avx.asm | 21 |
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 |
