?Visual Studio 11,具備并行模式庫和代理庫、 更輕松地開發多核處理器上運行的并行代碼。
這些庫的主要范例是根據任務 和并發運行庫,自定義的調度程序 進行處理的。
到目前為止,處理任務的的概念原型,就使用task_handle 類型 如下所示:
~~~
task_group task;
int i=0;
auto t1=make_task([&i]()
{
i=42;
});
int z=0;
auto t2=make_task([&z]()
{
z=42;
});
task.run_and_wait (t1);
task.run_and_wait (t2);
std::wcout << i+z << std::endl;
std::wcout << "Fini" << std::endl;
~~~
這里計算的 i + z 是必須得到的 lambda 表達式中引用變量 。然后這兩個任務并行完成它們的工作。
使用 Visual Studio 11,可以直接使用的task類型的概念,如下所示:
~~~
task<int> t1=task<int>(->int
{
return 42;
});
task<int> t2=task<int>(->int
{
return 42;
});
std::wcout << t1.get() +t2.get () << std::endl;
~~~
為了簡化語法,更需要為每項任務捕獲變量的引用,要通過調用方法wait()的每個任務并返回值角色的方法get (),獲取狀態以便處理 。
task類的異步任務的遵循設置的運行規則,無需等待,即是說,不論Tn 取決于 Tn-1 任務的任務以及前一任務已完成或沒有。
異步操作將概括為避免假死的用戶界面,很重要的是為了簡化開發過程,以前的VS經常卡死,加載控件的時候。
若要實現這一概念,task類實現的then()方法,將會執行一次已經完成后的該任務。
~~~
task<int> t1=task<int>(->int
{
return 42;
}).then ([](int i)->int
{
return i+42;
});
task<int> t2=task<int>(->int
{
//simule une charge
std::this_thread::sleep_for (chrono::seconds (1)); return 42;
}).then ([](int i)->int
{
return i+42;
});
std::wcout << t1.get() + t2.get() << std::endl;
~~~
每項任務的返回值是作為參數傳遞,例如lambda 表達式中的then()方法。
并行算法還包括 (parallel_for、 parallel_for_each、 parallel_invoke ))
并行算法的嘗試
parallel_sort 、 parallel_radixsort、 parallel_buffered_sort的標準如果命令它只運行并行模式,其中使用算法的方式都相同。
~~~
vector<unsigned int> v3;
parallel_sort(begin(v3),end(v3))
~~~
雖然在大多數情況下,這是一個簡單的類整數的性能足夠流暢了(示例矢量的整數 40 000 000,得到一個序列(std::sort)和parallel_sort(),允許更好地調控,會提高性能)
每種算法,都用來做重載,這個方法允許設置的字符串的排序和要使用的分區的大小。
~~~
vector<unsigned int> v2;
parallel_sort(begin(v2),end(v2),[](const unsigned int& l,const unsigned int& r)->bool
{
return (l<r);
},4096);
~~~
默認分區大小為 2048,對于大多數情況下就足夠了。可以調整最后一個分區的大小來提高性能。如果分區大小《=向量的大小,將使用任何方法std::sort ()中。(默認情況下,如果向量的元素的數目 < = 2048總是使用std::sort ()版本)。
~~~
inline void parallel_sort(const _Random_iterator &_Begin, const _Random_iterator &_End, const _Function &_Func, const size_t _Chunk_size = 2048)
{
_CONCRT_ASSERT(_Chunk_size > 0);
// We make the guarantee that if the sort is part of a tree that has been canceled before starting, it will
// not begin at all.
if (is_current_task_group_canceling())
{
return;
}
size_t _Size = _End - _Begin;
size_t _Core_num = Concurrency::details::_CurrentScheduler::_GetNumberOfVirtualProcessors();
if (_Size <= _Chunk_size || _Core_num < 2)
{
return std::sort(_Begin, _End, _Func);
}
_Parallel_quicksort_impl(_Begin, _Size, _Func, _Core_num * _MAX_NUM_TASKS_PER_CORE, _Chunk_size, 0);
21.}
~~~
系統至少不會以任何方式使用 std::sort () 的虛擬處理器。
可用其他算法的嘗試并根據實際需要。例如,在例子中的是基數排序
~~~
vector<unsigned int> v4;
parallel_radixsort(begin(v4),end(v4));
~~~
提供更好的結果 197.09 上 40 000 000 個項目。默認分區大小為 256 * 256
parallel_buffered_sort給 631
~~~
parallel_buffered_sort(begin(v5),end(v5));
~~~
減少
線程申請的數量,最小,最多的一組所有成員稱為一般減少。應用減少并行可以或者涉及爭用條件或問題的另外的浮點操作的舍入為例。
例如雙平行處理的循環,循環的量的一種方法是使用concurrency::combinable <T>對象
~~~
combinable<double> sumReduction;
parallel_for_each(begin(v1),end(v1),[&sumReduction](double i)
{
sumReduction.local ()+=i;
});
sum=sumReduction.combine (std::plus<double>());
~~~
Visual Studio 11,現在可以使用算法parallel_reduce(),比類型算法的使用效率更高(concurrency::combinable)。
它的使用是相對處理算法( std::accumulate)
~~~
vector<double>::const_iterator deb=begin(v1);
vector<double>::const_iterator fin=end(v1);
auto identity=std::iterator_traits<vector<double>::const_iterator>::value_type();
sum= parallel_reduce(deb,fin,identity,std::plus<double>());
~~~
轉型
最后的算法是加工**parallel_transformation()**算法
~~~
parallel_transform(begin(v1),end(v1),begin(v2),[](double value)->double
{
return value*2;
});
~~~
趕緊下載VS11體驗吧
[http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144](http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144)
- 前言
- Visual Studio 11開發指南(1) Visual Studio 11簡介與新特性
- Visual Studio 11開發指南(2) Visual Studio 11放棄宏處理
- Visual Studio 11開發指南(3)Visual Studio 11開發SharePoint 2011程序
- Visual Studio 11開發指南(4)Visual Studio 11編程語言發展
- Visual Studio 11開發指南(5)Visual Studio 11 IDE增強
- Visual Studio 11開發指南(6)Visual Studio 11平臺改進
- Visual Studio 11開發指南(7)NET 4.5的改善
- Visual Studio 11開發指南(8)Visual C++ 11新特色
- Visual Studio 11開發指南(9)Visual C++ 新功能體驗
- Visual Studio 11開發指南(10)Visual C++11 IDE 新功能體驗
- Visual Studio 11開發指南(11)Visual Studio 11調試游戲
- Visual Studio 11開發指南(12)Visual Studio 11可視化多核多線程編程的行為
- Visual Studio 11開發指南(13)C++11語言新特性
- Visual Studio 11開發指南(14)C++11---C++/ CX設計
- Visual Studio 11開發指南(15)C++11單元測試
- Visual Studio 11開發指南(16)C++11更新-多線程和異步操作管理
- Visual Studio 11開發指南(17)C++11更新- Lambda表達式
- Visual Studio 11開發指南(18)C++11更新-自動矢量器使用
- Visual Studio 11開發指南(19)C++11更新-并行模式庫和代理庫
- 在 C++ 中使用 PPL 進行異步編程
- 基于VisualStudio11開發Windows8的Metro sample講解(1)MessageBox
- Visual C++ 11 中新的并發功能
- 基于Windows8與Visual Studio2012開發內核隱藏注冊表
- 基于VC++2012在Windows8上實現文件隱藏
- 實現諾基亞 lumia Windows phone 的手機通話記錄截取
- 最短代碼實現windows8下的下載器-下載安裝執行一體化
- 用Visual studio2012在Windows8上開發內核驅動監視線程創建
- 用Visual studio2012在Windows8上開發內核驅動監視進程創建
- 基于Windows8與Visual Studio2012實現殺毒通用模塊
- 用Visual studio2012在Windows8上開發內核中隱藏進程
- 用Visual studio11在Windows8上開發內核枚舉注冊表
- 用Visual studio11在Windows8上開發內核驅動隱藏注冊表
- 用Visual studio11在Windows8上開發驅動實現注冊表監控和過濾
- 用Visual studio11在Windows8上開發驅動實現內存填0殺進程
- 【CSDN2012年度博客之星】喜歡本博客的讀者,投票贈送《visual C++2010開發權威指南》電子稿--感謝支持 ~(截至到2012年12月30日)
- 今天在清華圖書館看到我的杰作,感慨萬千,而我要歸零一切 !
- use Visual studio2012 developing kernel driver monitor thread creation on Windows8
- To kernel driver monitoring process developed in Windows8 create using Visual studio2012
- Under Windows8 kernel mode development NDIS application-NDIS Filter explain
- use Visual studio2012 development kernel to hidden process on Windows8