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

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>
            欧美日本中文字幕| 日韩亚洲综合在线| 欧美韩日视频| 欧美激情bt| 中文一区在线| 午夜精品婷婷| 影音欧美亚洲| 亚洲片区在线| 欧美日韩免费看| 午夜精品视频在线观看| 欧美一级视频免费在线观看| 亚洲大胆女人| 亚洲麻豆一区| 国产亚洲欧美一区在线观看| 免费不卡在线观看| 欧美日韩国产美| 久久国产免费| 欧美影院成人| 亚洲韩国精品一区| 国产精品一区=区| 蜜桃av一区二区在线观看| 欧美精品手机在线| 欧美在线免费视频| 老鸭窝毛片一区二区三区| 一本色道综合亚洲| 午夜精品久久久久久久久久久久| 亚洲第一页自拍| 99国产精品久久久久久久| 国产一区二区在线观看免费播放| 欧美激情视频一区二区三区在线播放| 欧美色另类天堂2015| 久久躁狠狠躁夜夜爽| 欧美理论在线| 久久久久久电影| 欧美日韩成人在线| 久久久久久久久久看片| 欧美激情五月| 久久久精品一区| 欧美成人性网| 香蕉免费一区二区三区在线观看| 久久免费视频一区| 亚洲欧美日韩电影| 欧美v国产在线一区二区三区| 亚洲欧美日韩中文视频| 美女精品网站| 欧美亚洲一区在线| 久久这里有精品15一区二区三区| 在线观看三级视频欧美| 亚洲国内精品| 狠狠色丁香婷婷综合久久片| 亚洲精品小视频在线观看| 黄色另类av| 亚洲手机在线| 亚洲美女免费精品视频在线观看| 欧美一区二区黄色| 99一区二区| 久久精品中文字幕一区二区三区| 亚洲欧美日韩成人高清在线一区| 亚洲精品中文字幕在线| 久久精品人人做人人综合 | 国产欧美精品一区aⅴ影院| 亚洲电影在线看| 国产一区二区三区四区| 一区二区欧美在线| 91久久久在线| 久久久久久久久久久久久9999| 亚洲欧美日韩另类| 欧美日韩国产a| 欧美激情第4页| 国产亚洲欧美日韩精品| 中文在线不卡视频| 99亚洲一区二区| 欧美电影免费观看高清| 另类天堂视频在线观看| 国产区在线观看成人精品| 亚洲最新中文字幕| 一本色道久久88综合亚洲精品ⅰ| 久久亚洲高清| 可以免费看不卡的av网站| 国产精品视频xxxx| 一区二区高清在线观看| 99精品视频免费在线观看| 免费成人黄色片| 你懂的网址国产 欧美| 黄色成人av网站| 欧美有码在线视频| 久久国产精品久久久久久久久久 | 欧美日韩另类国产亚洲欧美一级| 欧美成在线观看| 亚洲成人在线视频网站| 久久精品亚洲一区二区三区浴池| 免费欧美在线| 小黄鸭精品aⅴ导航网站入口| 欧美视频在线免费看| 亚洲三级色网| 日韩一级二级三级| 欧美黑人国产人伦爽爽爽| 欧美国产日韩一区二区| 激情国产一区| 欧美中文在线观看国产| 久久久久国产精品www| 国产日韩欧美综合一区| 午夜欧美视频| 久久久久久九九九九| 国产在线不卡| 久久久国产成人精品| 另类欧美日韩国产在线| 亚洲电影观看| 欧美1区2区3区| 欧美激情网友自拍| 日韩视频永久免费| 欧美黄色aa电影| 亚洲美女毛片| 亚洲免费伊人电影在线观看av| 国产精品久久久久久久久免费桃花| 在线亚洲精品| 欧美在线国产| 国产在线视频欧美| 久久在线精品| 亚洲国内精品在线| 亚洲亚洲精品三区日韩精品在线视频| 国产精品igao视频网网址不卡日韩| 正在播放日韩| 久久久91精品国产| 国产一区亚洲一区| 另类酷文…触手系列精品集v1小说| 亚洲成色www8888| 一区二区三区 在线观看视频| 欧美亚一区二区| 性xx色xx综合久久久xx| 久久精品首页| 永久91嫩草亚洲精品人人| 美女免费视频一区| 亚洲三级毛片| 国产精品久久久久久久久久久久| 久久综合久久综合久久| 亚洲国产一区在线| 欧美日本韩国| 亚洲男人av电影| 老牛国产精品一区的观看方式| 亚洲国产视频a| 欧美色精品在线视频| 性欧美长视频| 欧美成人午夜免费视在线看片| 日韩午夜电影av| 国产精品久久久久国产精品日日| 欧美一区二区三区视频在线| 欧美国产专区| 亚洲欧美日韩成人| 尤物九九久久国产精品的特点 | 久久久亚洲欧洲日产国码αv| 亚洲国产精品成人久久综合一区| 亚洲无线观看| 国产亚洲欧洲| 欧美精品一区视频| 午夜精品在线看| 亚洲国产乱码最新视频| 欧美一级免费视频| 亚洲国产欧美一区二区三区丁香婷| 欧美日韩国产色综合一二三四| 亚洲欧美综合网| 亚洲激情成人网| 久久大逼视频| 亚洲美女视频网| 国产午夜精品美女视频明星a级| 欧美91精品| 亚洲欧美日韩精品久久久久| 亚洲二区三区四区| 欧美一区二区三区啪啪| 亚洲精品日本| 国产一区二区丝袜高跟鞋图片| 欧美日产国产成人免费图片| 久久riav二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美一级视频| 一本色道久久加勒比精品| 黄网站免费久久| 国产精品成人一区二区三区夜夜夜| 久久婷婷亚洲| 亚洲无玛一区| 在线观看91精品国产麻豆| 久久久天天操| 亚洲一区二区三区激情| 亚洲国产高清视频| 久久精品国产欧美亚洲人人爽| 亚洲精品在线免费| 一区二区三区我不卡| 国产精品女人网站| 欧美精品免费在线| 久久九九电影| 亚洲视频导航| 亚洲电影专区| 欧美+亚洲+精品+三区| 欧美中文字幕视频| 亚洲淫片在线视频| 日韩一级裸体免费视频| 亚洲第一区在线观看| 国产亚洲精品成人av久久ww| 国产精品av免费在线观看| 欧美激情一区二区三区在线视频观看 |