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
| size_t samples = file.file_size / 4; size_t ir_samples = sizeof(ir) / 4; for (size_t i = 0; i < samples; ++i) { __m256 out = { 0 }; for (size_t j = 0; j < ir_samples && i >= j; j += 8) { __m256 mm256_ir = _mm256_load_ps(ir + j); __m256 in; switch (i - j) { // _mm256_set_ps 以逆序加载数据,即第一个参数对应 out.m256_f32[7],最后一个参数对应 out.m256_f32[0] case 0: in = _mm256_set_ps(0, 0, 0, 0, 0, 0, 0, file.in_file_data[0]); break; case 1: in = _mm256_set_ps(0, 0, 0, 0, 0, 0, file.in_file_data[0], file.in_file_data[1]); break; case 2: in = _mm256_set_ps(0, 0, 0, 0, 0, file.in_file_data[0], file.in_file_data[1], file.in_file_data[2]); break; case 3: in = _mm256_set_ps(0, 0, 0, 0, file.in_file_data[0], file.in_file_data[1], file.in_file_data[2], file.in_file_data[3]); break; case 4: in = _mm256_set_ps(0, 0, 0, file.in_file_data[0], file.in_file_data[1], file.in_file_data[2], file.in_file_data[3], file.in_file_data[4]); break; case 5: in = _mm256_set_ps(0, 0, file.in_file_data[0], file.in_file_data[1], file.in_file_data[2], file.in_file_data[3], file.in_file_data[4], file.in_file_data[5]); break; case 6: in = _mm256_set_ps(0, file.in_file_data[0], file.in_file_data[1], file.in_file_data[2], file.in_file_data[3], file.in_file_data[4], file.in_file_data[5], file.in_file_data[6]); break; default: in = _mm256_set_ps(file.in_file_data[i - j - 7], file.in_file_data[i - j - 6], file.in_file_data[i - j - 5], file.in_file_data[i - j - 4], file.in_file_data[i - j - 3], file.in_file_data[i - j - 2], file.in_file_data[i - j - 1], file.in_file_data[i - j]); break; } out = _mm256_fmadd_ps(in, mm256_ir, out); } file.out_file_data[i] = out.m256_f32[0] + out.m256_f32[1] + out.m256_f32[2] + out.m256_f32[3] + out.m256_f32[4] + out.m256_f32[5] + out.m256_f32[6] + out.m256_f32[7]; }
|