Получение MSVC, чтобы приблизить производительность Clang - PullRequest
4 голосов
/ 11 июня 2019

Я пытаюсь получить достойную производительность от MSVC для этого кода.Мой наивный тест показывает, что время выполнения исполняемого файла clang составляет около 10% времени выполнения MSVC.GCC находится между двумя и обычно составляет около 25% MSVC.Можно ли обмануть MSVC для создания лучшей сборки?Я посмотрел на Compiler Explorer , но мои эксперименты не имели большого значения.Для фона это основной блок генератора случайных чисел Philox4x32.

#include <inttypes.h>
#include <time.h>
#include <stdio.h>

struct array2x32 {
  uint32_t v[2];
};
struct array4x32 {
  uint32_t v[4];
};


struct array4x32 round4x32(struct array4x32 ctr, struct array2x32 key) {
  uint32_t hi0, hi1, lo0, lo1;
  uint64_t product;
  product = 0x00000000D2511F53ULL * (uint64_t)ctr.v[0];
  lo0 = (uint32_t)product;
  hi0 = ((uint32_t)(product>>32)) ^ ctr.v[3] ^ key.v[1];
  product = 0x00000000CD9E8D57ULL * (uint64_t)ctr.v[2];
  lo1 = (uint32_t)product;
  hi1 = ((uint32_t)(product>>32)) ^ ctr.v[1] ^ key.v[0];
  struct array4x32 out = {{hi1, lo1, hi0, lo0}};
  return out;
}

#define N 1000000000
int main(){
      struct array4x32 ctr = {{0, 0, 0, 0}};
  struct array2x32 key = {{0, 0xDEADBEAF}};
  struct array4x32 out;
  uint64_t count = 0, sum = 0;
  int i, j;
  clock_t begin = clock();
  for (i = 0; i < N / 4UL; i++) {
    ctr.v[0]++;
    out = round4x32(ctr, key);
    for (j = 0; j < 4; j++) {
      sum += out.v[j];
      count++;
    }
  }
  clock_t end = clock();
  double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  printf("%0.10f", time_spent);
  printf("0x%" PRIx64 "\ncount: %" PRIu64 "\n", sum, count);
  printf("%" PRIu64 " randoms per second\n",
         (uint64_t)((N / time_spent) / 1000000 * 1000000));
}
...