優化等級與運行效率

簡介

探討優化等級與運行效率關係.

簡單加法運算

測試平臺

  • STM32F407(時鐘168MHz)
  • Zynq 7z020(單核)
  • Intel i5-4590 CPU @3.3GHz 3.3GHz

測試核心代碼

::

void add(u32 N);
void test_add(void)
{
	u32 N=100000;
	
	while(N-->0)
	{
		add(100000);
	}

	return;
}

void add(u32 N)
{
	u32 a=0, b=0;
	while(N-- > 0)
	{
		a = b+N;
	}
	
}

測試結果

下圖爲STM32F407 運行記錄

STM32F407 運行記錄

下圖爲ZYNQ 7Z020 運行記錄

ZYNQ 7Z020 運行記錄

下圖爲Intel i5-4590 運行記錄

Intel i5-4590 運行記錄

下圖給出了各平臺運算時間效率對比結果圖

運算效率對比結果

快速傅里葉變換

測試平臺

  • STM32F407(時鐘168MHz)
  • Zynq 7z020(單核)

測試核心代碼

::

void invert(complex32 *pSrc, u32 n)
{
	int *a, i, j, w, t;
	complex32 tc;
	a = (int*)malloc(sizeof(int)*n);
	for (i = 0; i < n; i++)
		a[i] = i;
	w = n / 2;
	j = n / 2;
	for (i = 1; i<n - 1; i++)
	{
		if (a[i] != j)
		{
			t = a[j];  a[j] = a[i];  a[i] = t;
			tc = pSrc[j];
			pSrc[j] = pSrc[i];
			pSrc[i] = tc;
		}
		w = n / 2;
		while (j >= w)
			j = j - w, w = w / 2;
		j = j + w;
	}
	free(a);
}

void fft32(complex32 *pSrc, u32 n)
{
	u32 kn, k, a, b, c, d, e, i, i1, i2;
	complex32 *Wn, x1, x2;

	invert(pSrc, n);
	Wn = (complex32*)malloc(sizeof(complex32)*n / 2);
	for (i = 0; i<n / 2; i++)
	{
		Wn[i].real = cos(2 * PI*i / n);
		Wn[i].imag = -sqrt(1 - (Wn[i].real*Wn[i].real));
	}
	kn = log2(n);
	b = 1;  a = n / 2;  c = 2;
	for (k = 0; k<kn; k++)
	{
		for (d = 0; d<a; d++)
			for (e = 0; e<b; e++)
			{
				i1 = c * d + e;  i2 = i1 + b;
				x1 = pSrc[i1];
				x2.real = pSrc[i2].real*Wn[e*a].real - pSrc[i2].imag*Wn[e*a].imag;
				x2.imag = pSrc[i2].real*Wn[e*a].imag + pSrc[i2].imag*Wn[e*a].real;
				pSrc[i1].real = x1.real + x2.real;
				pSrc[i1].imag = x1.imag + x2.imag;
				pSrc[i2].real = x1.real - x2.real;
				pSrc[i2].imag = x1.imag - x2.imag;
			}
		b = b * 2;  a = a / 2;  c = c * 2;
	}
	free(Wn);
}

測試結果

1024點, float32型FFT, 運行100000, 取平均.

  • STM32F407(時鐘168MHz, 上述代碼): 21.4ms, 優化等級爲3
  • Zynq 7z020(單核, 上述代碼): 2.2ms, 無優化
  • STM32F407(時鐘168MHz, STM32官方庫): 0.78ms, 優化等級爲3
  • Zynq 7z020(單核, STM32官方庫): 0.71ms, 無優化
  • Zynq 7z020(單核, STM32官方庫): 0.23ms, 優化等級爲3
  • Zynq 7z020(單核, Ne10): 0.7ms

編譯優化等級的影響

測試平臺

  • STM32F407(時鐘168MHz)
  • Zynq 7z020(單核)

測試核心代碼

上述代碼

測試結果

  • 平臺: STM32F407(時鐘168MHz)
    • 對較簡單的加法(1e10次)
      • 優化等級0: 300s
      • 優化等級3: 180s
    • 對較複雜的FFT(1e4次, 上述複雜程序)
      • 優化等級0: 217s
      • 優化等級3: 214s
  • 平臺: Zynq 7z020(單核)
    • 對較簡單的加法(1e10次)
      • 優化等級0: 300s
      • 優化等級3: 180s
    • 對較複雜的FFT(1e5次, STM32官方庫)
      • 優化等級0: 71.2s
      • 優化等級3: 22.9s

可見優化等級越高, 運行效率越高, 特別地, 對於上述加法, 由於 a 僅在 a = b+N 中被使用, 所以可以省去賦值操作, 因而優化等級高時, 會將此優化, 因而運算效率差距明顯. 對於較複雜的算法, 如果程序中不存在冗餘無用的代碼, 優化前後, 應該相差不大.

在這裏插入圖片描述

結論:

  1. 優化等級爲O0 與 O1~O3時相比, 運行時間相差較大;
  2. 優化等級爲O1, O2, O3時相比, 運行時間相差不大;
發佈了84 篇原創文章 · 獲贊 131 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章