level 1
如果有谁有兴趣,以下是源代码
#include <stdio.h>
#include <stdlib.h>
#include <immintrin.h>
#include <string.h>
#define SIZE 1024*1024*128
#define RUN 512
static short VEC_A[SIZE], VEC_B[SIZE], VEC_C[SIZE];
int main(int argc, char* argv[])
{ __m256i vec1, vec2, vec3;
// A slightly faster method to create single bit random variable for (int i = 0; i < SIZE; i += 32) { int tmp1 = rand(); int tmp2 = rand(); for (int k = 0; k < 32; k++) { VEC_A[i+k] = tmp1>>k & 0x0001; VEC_B[i+k] = tmp2>>k & 0x0001; } }
if (argc == 2)
for (int H = 0; H < RUN; H++) { if (strcmp(argv[1], "avx") == 0) for (int i = 0; i < SIZE; i += 16) { vec1 = _mm256_load_si256((__m256i*) &VEC_A[i]); vec2 = _mm256_load_si256((__m256i*) &VEC_B[i]); vec3 = _mm256_mullo_epi16(vec1, vec2); _mm256_store_si256 ((__m256i*) &VEC_C[i], vec3); }
if (strcmp(argv[1], "avxstream") == 0) for (int i = 0; i < SIZE; i += 16) { vec1 = _mm256_stream_load_si256((__m256i*) &VEC_A[i]); vec2 = _mm256_stream_load_si256((__m256i*) &VEC_B[i]); vec3 = _mm256_mullo_epi16(vec1, vec2); _mm256_store_si256 ((__m256i*) &VEC_C[i], vec3); }
if (strcmp(argv[1], "x86") == 0) for (int i = 0; i < SIZE; i ++) VEC_C[i] = VEC_A[i] & VEC_B[i]; }
return 0;}
2019年07月21日 09点07分
3