2015-04-12 30 views
0

說我有可以從具有不同分配器的stl容器構造嗎?

std::vector<T, allocator1=default allocator in STL> A 

std::vector<T, allocator2=some other allocator> B 

我使用__offload :: shared_allocator如allocator2中的Cilk加上從主CPU卸載到至強融核協處理器

我可以構造的B?

std::vector<T> A{B.begin(), B.end()}; 

更一般的是,對於哪種類型的STL函數,不同的分配器會有什麼關係?

+3

這不是要調用拷貝構造函數。 –

+0

好的,對不起...我會改名爲 – yidiyidawu

+0

只要它們不是平凡的指針,不是'std :: vector > :: iterator'是不同於'std: :vector > :: iterator'? –

回答

0

正如評論指出的那樣,構造

std::vector<T> A{B.begin(), B.end()}; 

應該可以正常工作,因爲它可以用於任何兩個迭代器。至於「哪種STL功能是不同的分配器重要?」的問題,有兩種「不同」:

  1. 不同類型的分配器。
  2. 具有相同類型的分配器,但比較不同。

對於與(1)不兼容的情況,您應該看到編譯時錯誤,因爲類型系統會捕獲它。對於(2),我不知道STL實現是否可以解決可能存在的問題。在這方面擔心的主要容器/函數是list類中的splice方法(和forward_list類中的splice_after方法),因爲它們將在一個容器中分配的對象移動到另一個容器。正如C++ 11標準筆記的腳註265所述,STL容器要求分配器比較相等,因此這種移動不應成爲問題。

對於卸載問題,如果A被分配了一個普通的STL分配器,那麼它不能在主機端構造並在協處理器端使用。但是B可以用於雙方。這裏是一個例子,它在協處理器端從它構造出卸載:: shared_allocator , and constructs A`。

#pragma offload_attribute (push, _Cilk_shared) 
#include <vector> 
#include "offload.h" 
#include <cstdio> 
#pragma offload_attribute (pop) 

_Cilk_shared std::vector<int, __offload::shared_allocator<int> > B; 

_Cilk_shared void foo() { 
#ifdef __MIC__ 
    std::vector<int> A(B.begin(),B.end()); 
    for(auto& x: A) 
     std::printf("%d\n", x); 
#else 
    std::printf("Host\n"); 
#endif 
} 

int main() { 
    auto y = 1; 
    for(int i=0; i<10; ++i) { 
     B.push_back(y); 
     y *= 10; 
    } 
    _Cilk_offload foo(); 
} 

它應該打印:

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000 
+0

因此,從C++的角度來看,一切都很好。但從英特爾至強融核協處理器的角度來看 - 您在卸載區使用B,但A怎麼樣?我有很多東西需要學習如何在卸載代碼中使用C++,所以我可以全部弄溼,但是我不相信A可以用在卸載區域中,並且當你第一次使用A中的分配器時,你會不會弄亂只要在卸載的代碼中使用它就可以了? – froth

+0

我已經擴展了我的答案,嘗試解決這一問題。 –

+0

但是,如果A在協處理器上構建,並且將一個元素插入到A中,那麼如果在主機端迭代B,會發生什麼情況?它不會把你送進雜草嗎? – froth