青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

string

string
posts - 27, comments - 177, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
通常我們大量使用array of structure來開發程序,因為array of structure 具有面向對象的特征,易于描述客觀世界,代碼也容易理解。但是 array of structure 卻常常會阻礙程序的并行化。
structure of array 與之相反,它易于并行化,但拙于描述客觀世界,代碼也變得難以理解。 
要想代碼性能好就要使用structure of array , 要想開發效率高就要使用array of structure, 設計之初就要做出選擇,開發后期如果想轉換到另一種方案將會大費周章。 
 Intel 的 Array building block 提供了一套編程接口 讓我們可以從array of structure 的視角編寫基于 structure of array的程序。這話說起來有點繞,可以這樣理解,在邏輯層是array of structure , 在物理層是structrue of array. 
在C++中我們如何實現這種邏輯層(array of structure )/物理層(structrue of array )的分離與映射呢?
這是我們基于array of structure 的程序
struct RGB
{
        int r;
        int g;
        int b;
};
template<class T>
void test(T& rgb, size_t n)
{
    int i =0;
    for(i=0;i<SIZE;i++){
        rgb[i].r = 3*i;
        rgb[i].g = 3*i + 1;
        rgb[i].b = 3*i + 2;
    }
    for(i=0;i<SIZE;i++){
        rgb[i].b=rgb[i].r + rgb[i].g;
    }

#define SIZE 65536
int main()
{
  RGB* rgb = new RGB[SIZE];
  test(rgb, SIZE);
}

要將上面的程序轉換為SOA,我們首先為RGB定義一個影子
struct RGBshadow
{
        RGBshadow(int& r, int& g, int& b):r(r),g(g),b(b){}
        int& r;
        int& g;
        int& b;
};

然后我們有一個模板類用于定義SOA類,此類為通用類
template<class Shadow, typename T1, typename T2, typename T3>
class SOA
{
    public:
        typedef T1 aligned_t1 __attribute__((aligned(16)));
        typedef T2 aligned_t2 __attribute__((aligned(16)));
        typedef T3 aligned_t3 __attribute__((aligned(16)));
    public:
        SOA(int n){
            r = (aligned_t1*)_mm_malloc(n*sizeof(T1), 64);
            g = (aligned_t2*)_mm_malloc(n*sizeof(T2), 64);
            b = (aligned_t3*)_mm_malloc(n*sizeof(T3), 64);
        }
        ~SOA(){
            if(r) _mm_free(r);
            if(g) _mm_free(g);
            if(b) _mm_free(b);
        }
        Shadow operator [] ( size_t i){
            return Shadow(r[i],g[i],b[i]);
        }
    private:
        aligned_t1* r ;
        aligned_t2* g ;
        aligned_t3* b ;
};

#define SIZE 65536
int main()
{
  RGB* rgb = new RGB[SIZE];
  test(rgb, SIZE);
  SOA<RGBshadow, intint,int> soa(SIZE);
  test(soa, SIZE);
}
編譯器會自動向量化test(soa,SIZE);
test(rgb, SIZE);中的第二個for循環生成的代碼如下:
.L14:
    movl    (
%rbx,%rax), %edx
    addl    
4(%rbx,%rax), %edx
    movl    
%edx, 8(%rbx,%rax)
    addq    $
12%rax
    cmpq    $
786432%rax
    jne .L14

test(soa, SIZE);中的第二個for循環生成的代碼如下:
.L16:
    movdqa  (
%rsi,%rax), %xmm0
    paddd   (
%rcx,%rax), %xmm0
    movdqa  
%xmm0, (%rdx,%rax)
    addq    $
16%rax
    cmpq    $
262144%rax
    jne .L16

要將AOS轉換為SOA,分如下三步
1。 定義一個影子結構
2。 利用SOA<shadow,...>模板定義相應的SOA結構
3。 修改業務代碼,SOA<shadow,...> 與AOS有相同的操作方式,因而可以盡量少的修改代碼。


Feedback

# re: 并行化你的程序--Array of structure 與 structure of Array  回復  更多評論   

2012-08-06 14:14 by ningle
看你的博客,uefi的application基本都是用C++寫成,難道這是現在uefi application開發的主流嘛?

# re: 并行化你的程序--Array of structure 與 structure of Array  回復  更多評論   

2012-08-06 22:16 by djx_zh
@ningle
開發UEFI application的主流還是C。 如果application規模十分龐大,用C++開發效率會高些。

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩成人一区| 欧美日韩免费视频| 欧美一区午夜精品| 国产一区二区三区黄| 老司机精品导航| 亚洲一级黄色| 日韩视频―中文字幕| 久久一区欧美| 亚洲午夜久久久久久久久电影院 | 久久成人久久爱| 亚洲精品美女91| 午夜亚洲一区| 一区二区三区|亚洲午夜| 国产欧美日韩在线视频| 国产麻豆成人精品| 亚洲在线观看| 亚洲三级影片| 欧美国产亚洲另类动漫| 欧美国产视频一区二区| 亚洲国产精品va在看黑人| 亚洲成人中文| 91久久黄色| 亚洲香蕉网站| 久久亚洲捆绑美女| 欧美国产三级| 亚洲精品一区二区在线| 亚洲一区在线观看视频 | 亚洲精品国产视频| 在线亚洲自拍| 亚洲动漫精品| 久久精品电影| 欧美欧美天天天天操| 欧美日韩不卡合集视频| 国产午夜精品在线| ●精品国产综合乱码久久久久| 一本久道久久综合中文字幕| 欧美亚洲一区二区在线观看| 欧美91大片| 欧美激情一区二区三区在线视频观看| 欧美亚洲自偷自偷| 美女黄毛**国产精品啪啪| 亚洲五月婷婷| 国产精品v片在线观看不卡| 亚洲国产欧美不卡在线观看| 久久久999国产| 久久久久久久波多野高潮日日| 国产精品播放| 性欧美暴力猛交69hd| 宅男噜噜噜66国产日韩在线观看| 欧美大片91| 亚洲精品乱码久久久久久| 久久人体大胆视频| 亚洲午夜视频在线| 久久久青草婷婷精品综合日韩| 久久精品欧洲| 亚洲国产欧美一区二区三区丁香婷| 亚洲黄页一区| 久久精品91久久久久久再现| 久久久综合网| 欧美日韩亚洲成人| 久久国产一区二区| 欧美激情视频一区二区三区不卡| 欧美激情精品久久久| 国产乱码精品一区二区三区忘忧草| 国产午夜精品福利| 亚洲承认在线| 亚洲一区二区三区四区在线观看 | 亚洲欧洲一区二区在线观看| 欧美激情一区二区三区四区| 亚洲人在线视频| 欧美一二三区精品| 校园激情久久| 久久婷婷国产综合精品青草 | 欧美亚洲色图校园春色| 亚洲欧洲日产国产综合网| 久久精品成人一区二区三区蜜臀 | 欧美二区在线看| 午夜精品影院| 国产综合婷婷| 午夜影院日韩| 欧美中文在线观看| 国产日韩免费| 欧美视频中文在线看 | 久久亚洲精品视频| 午夜一区在线| 国内伊人久久久久久网站视频| 一区福利视频| 麻豆精品91| 亚洲精品美女91| 亚洲毛片视频| 欧美日韩一区二区三区免费看| 一本色道久久综合狠狠躁篇的优点 | 亚洲视频欧美视频| 国产精品综合视频| 久久夜色精品国产欧美乱| 久久精品水蜜桃av综合天堂| 亚洲欧洲日产国码二区| 欧美好骚综合网| 99国产精品久久久久老师| 亚洲一区二区在线看| 原创国产精品91| 久久综合图片| 国产女人18毛片水18精品| 免费在线成人av| 欧美色欧美亚洲另类七区| 欧美一区二区成人6969| 久久久午夜精品| 亚洲欧美欧美一区二区三区| 亚洲卡通欧美制服中文| 黄色精品一区二区| 欧美一区二区国产| 国产精品久久久久久久久久免费看 | 性色一区二区三区| 久久狠狠久久综合桃花| 久久精品国产第一区二区三区最新章节 | 欧美视频一区二区三区| 最新日韩av| 免费国产一区二区| 亚洲第一偷拍| 在线看视频不卡| 午夜免费在线观看精品视频| 亚洲女女女同性video| 欧美高清视频www夜色资源网| 久久九九全国免费精品观看| 欧美性事在线| **欧美日韩vr在线| 欧美国产在线视频| 亚洲欧洲日韩综合二区| 欧美精品国产精品日韩精品| 亚洲精品孕妇| 一区二区三区视频在线| 欧美区在线观看| 亚洲欧美日韩精品久久亚洲区| 亚洲女人天堂成人av在线| 国产一二精品视频| 久久久91精品国产| 亚洲精品一级| 亚洲精品国产精品乱码不99按摩| 久久精品欧美| 亚洲曰本av电影| 亚洲午夜久久久久久久久电影院 | 国语自产精品视频在线看抢先版结局| 亚洲三级影片| 亚洲丁香婷深爱综合| 亚洲在线观看免费| 亚洲盗摄视频| 亚洲欧美日韩一区二区三区在线观看 | 亚洲视频在线观看一区| 91久久国产自产拍夜夜嗨| 美女视频黄 久久| 国产精品草草| 亚洲少妇自拍| 国产九色精品成人porny| 久久精品夜色噜噜亚洲a∨| 性伦欧美刺激片在线观看| 国内精品久久久久久 | 国产日产高清欧美一区二区三区| 国产午夜精品麻豆| 免费不卡亚洲欧美| 欧美日韩在线播放三区| 亚洲毛片在线| 欧美婷婷久久| 精久久久久久| 国产精品99久久不卡二区| 亚洲高清中文字幕| 国产精品久久久久秋霞鲁丝| 亚洲男女自偷自拍图片另类| 老司机午夜精品| 先锋资源久久| 亚洲视频免费在线观看| 久久九九电影| 亚洲乱码国产乱码精品精| 一区精品久久| 一本一道久久综合狠狠老精东影业| 欧美三级午夜理伦三级中文幕| 亚洲视频免费看| 欧美视频一区二区三区…| 欧美丰满少妇xxxbbb| 美女精品国产| 最近看过的日韩成人| 亚洲高清在线播放| 欧美影院午夜播放| 老司机免费视频久久| 99xxxx成人网| 亚洲一区二区三区在线| 狠狠久久五月精品中文字幕| 美女脱光内衣内裤视频久久网站| 久久免费精品视频| 午夜精品久久久久久久| 久久综合中文色婷婷| 亚洲你懂的在线视频| 欧美伦理91| 亚洲国产美女久久久久 | 欧美日本精品| 久久精品人人| 国产精品免费观看在线| 蜜臀av一级做a爰片久久| 国产精品看片资源| 一区二区三区四区五区精品视频 | 狠狠久久亚洲欧美专区|