2012年8月26日 星期日

安裝Windows 8在外接硬碟上

我因為工作的關係經常需要轉換作業系統,Windows multi-boot的功能已不足以應付,後來發現Toshiba可以直接使用外接硬碟開機,當插入裝有OS的外接硬碟時使用系統會使用外接硬碟開機,這真是一個很方便的功能。

因為速度的考量,我都是使用eSATA的硬碟,或許新一代的USB 3.0也可以這樣使用。

我的配備:
Toshiba TECRA M-11
Segate FreeAgent + eSata
Windows 8 (RTM)

0. 備份
開工前別忘了先備份以免一失足成千古恨啊~

1. 移除原有的硬碟
如果不先移除原有的硬碟,等安裝完另一個OS後,不論有無使用外接硬碟,開機畫面會進入到Windows multi-boot的畫面。為了避免這種情形還是免不了要先把原有的硬碟移除。

2. 接上外接硬碟
Segate eSATA

Toshiba eSata / power USB port

* Toshiba的eSATA似乎有bug,在開機時我會建議除了eSATA port外,USB port必需有一個USB port也有連接裝置。以我為例,在安裝時另一個USB port接著一個USB外接鍵盤。

3. 更改BIOS
開機時按「ESC」→「F12」成功進入BIOS設定的畫面

在安裝Windows 8時把eSATA裝置設定為第一個啟動裝置是必需的,否則安裝到一半就會看到以下這個畫面,無法成功安裝。

設定好eSATA為第一個啟動裝置後,儲存BIOS(F10)設定重新啟動電腦

按 「ESC」→「F2」 強制使用光碟開機

4. 安裝中…
依著指示裝就對了

5. 接回原有的硬碟

6. 設定內建硬碟為Offline
Windows 8似乎使用了與Windows 7不相容的硬碟模式,當把Windows 8和Window 7安裝在一起時,硬碟常會引發CHKDSK的動作。

如果要避免這個問題,可以把將原本的硬碟設定為Offline。

設定方式:「Control Panel」→「System and Security」→「Administrative Tools」→「Computer Management」

在「Storage」→「Disk Management」中把Windows 7硬碟設定為Offline即可


* 如果要讓內建硬碟為預設開機
我自已的習慣還是會讓內建的硬碟做為預設的開機系統,當我要使用eSATA開機時,在開機時按下「E」鍵即可。

* 關於Toshiba的eSATA在開機時必需有一個USB port插著一個設備的問題,並不是每次發生,我的判斷應該和電力有關,當USB port都沒有插著設備時,eSATA似乎有時供電會晚於內建的硬碟與光碟(我發現有時硬碟燈亮的較慢),造成即使BIOS開機的順序即使設定為第一個設備時,仍無法順利開機。為了讓安裝順利(因為安裝過程可能會常常重開機),我會建議接著一個USB設備再安裝。但是當安裝完成後平時的使用我並不會插著USB設備,通常不幸失敗了再重開一次就沒問題了。

* Toshiba的eSATA是有帶電力的Power eSATA,可是奇怪的是市面上我唯一找到的Power eSATA就只有Segate的eSATA模組。使用這款外接硬碟的好處是可以省下一個USB port。缺點是無法使用其他現有的硬硬或是SSD,如果有更好的外接盒推廌選則也可交流交流。



2012年4月8日 星期日

知識更新 建立選單和快捷鍵

MFC要為我們的選單加入快捷鍵其實是很簡單的,Visual Studio從古代的Visual C++就提供使用者在Resource檔中編寫Accelerator Table讓我們把相關連的選單和快捷鍵連結在一起,在VS 2010的使用者界面長的像下圖所示。
我們可以直接在rc檔中編輯選單所使用的快捷鍵,或是在properties中選擇。

這個功能實際上測試起來應該會發現"新"建立的快捷鍵是沒有反應。如果你的執行程式曾經成功執行過一次,MFC會自動把accelerator table寫到註冊檔中,之後即使我們修改了快捷鍵也都不會自動更新註冊的結果。如果快捷表有修改過,那就把註冊檔中的快捷表刪除吧。
微軟說,這可是新功能不是Bug喔(註1)

如果不想更改註冊檔,可從選單的[View] / [Toolbars and Docking Windows] / [Customize....]使用"新"界面進行設定。


註1. Visual Studio 2010 Unable to Commit Accelerator Resource Changes

2012年1月16日 星期一

C++ AMP 第一次接觸

這只是一個PPL的範例轉換為C++ AMP的嘗試,主要是了解C++ AMP語法,測試的結果或許不足以代表C++ AMP的長處。

 我是以Parallel Programming with Microsoft Visual C++的BasicParallelLoops範例修改與測試。

C++ AMP與PPL有3點不一樣的地方必需修改
1. C++ AMP不支援C array的讀寫,必需改用Concurrency::array或Concurrency::array_view。
2. C++ AMP的只有一個起點:parallel_for_each(...) restrict(direct3d)
3. 在parallel_for_each(...) restrict(direct3d)中所使用的函式也必需加上restrict(direct3d)的關鍵字。

修改原程式的Example02為:

void Example12(vector<double>& results, int workLoad)
{
 int num = results.size();

 array<double, 1> resAMPs(num, results);

 parallel_for_each(resAMPs.grid, [&resAMPs, workLoad](index<1> idx) restrict(direct3d) {
  
  resAMPs[idx] = DoWorkAMP(idx.get_x(), workLoad);
 });
}

修改原程式碼的DoWork:

float DoWorkAMP(int i, int workLoad) restrict(direct3d)
{
 float result = 0;

 for (int j = 1; j < workLoad + 1; ++j)
 {
  float j2 = (float)j;
  float i2 = (float)i;
  result += sqrt((9.0f * i2 * i2 + 16.0f * i * i) * j2 * j2);
 }

 return result;
}


DoWorkAMP有一個奇怪的地方,原程式碼中的運算是以double的資料格式進行,但在C++ AMP中,即使只是單純的做資料轉換,如:

double i2 = (double)i;

也會發生程式crash的意外。有可能是因為大多數的GPU並不提供double的原因,但不知這點未來是否能在編譯時提出警示。

最終的執行效能是很糟的,在Core2 Quad 2.66GHz + nVidia GeForce GT 2400 + Windows 7 x64系統上的結果


Parallel For Examples (workLoad=1000,NumberOfSteps=10)
Sequential for             : 0.19 ms
Simple parallel_for        : 0.87 ms
Simple parallel_for (AMP)  : 210.89 ms
Parallel For Examples (workLoad=100,NumberOfSteps=100)
Sequential for             : 0.14 ms
Simple parallel_for        : 0.08 ms
Simple parallel_for (AMP)  : 168.46 ms
Parallel For Examples (workLoad=10,NumberOfSteps=1000)
Sequential for             : 0.14 ms
Simple parallel_for        : 0.09 ms
Simple parallel_for (AMP)  : 172.68 ms

C++ AMP究竟能帶給商業運算多少的助益,他的長處在那裡(除了語法更為接近C++),我還看不太出來。