2016-12-29 112 views
1

我知道這是一個簡單的問題,但我一直未能找到答案。使用類型爲'array'的類成員

我想要一個C++類來管理大塊內存,當調用某個類方法時,內存在GPU中經常處理。類構造函數被傳遞給數組的大小,並且在構造之後,數組大小永遠不會改變。執行parallel_for_each的方法在不需要時不應浪費處理器週期或內存。

我該怎麼做?

我不能創建一個concurrency ::數組作爲類成員,因爲我需要知道數組在創建之前有多大。我不能有一個指向concurrency :: array的成員(然後在例如構造函數中用'new'來分配它),因爲我無法弄清楚如何將它指定給parallel_for_each。

在旁註中,我通常不需要在GPU和主機之間複製陣列,但是如果由於某種原因,我必須這樣做,只要它沒有定期完成即可。否則,會根據陣列的大小浪費處理器週期和內存。

下面是一個像我想要的東西的例子。當然,parallel_for_each捕獲的引用/指針是錯誤的。 (這是不檢查語法):

class MyClass 
{ 
    int* myHostArrayPtr; 
    concurrency::array<int,1>* myGpuArrayPtr; 

    MyClass(int size) 
    { 
     myHostArrayPtr = new int(size); 

     memset(myHostArrayPtr,0,size * sizeof(int)); 

     myGpuArrayPtr = new concurrency::array<int,1>(size,myHostArrayPtr); 
    } 

    void ProcessInGpu() 
    { 
     parallel_for_each(
      myGpuArrayPtr->extent, 
      [&myGpuArrayPtr](index<1> i) restrict(amp) 
      { 
       myGpuArray[i]+=14; 
      } 
     ); 
    } 
}; 

回答

0

我想,你在這裏需要的模板:

template <std::size_t N> class MyClass { 
    concurrency::array<int,N> myGpuArray; 
    ... 
} 

int main() { 
    MyClass<10> someName; 
    ... 
} 
+0

那麼,這仍然是一個硬編碼數組大小,因爲模板參數必須是常量。 – Digiproc

0

OK,我想我想通了。必須將parallel_for_each放入一個引用數組對象的函數中,然後可以通過引用傳遞給parallel_for_each。即:

void MyClass::Process(concurrency::array<int,1>& myGpuArray){ 
    parallel_for_each(
     myGpuArray.extent, 
     [&myGpuArray](index<1> i) restrict(amp) 
     { 
      myGpuArray[i]+=14; 
     } 
    ); 
} 

這很有趣,因爲它真的是一個臨時的解決C++的缺點,你不能指指向的變量作爲參考,而不上述函數調用的變通(我認爲?)。 (也就是說,不要調用複製構造函數)。

編輯:

是的,上述作品。我對它進行了基準測試,它和使用本地數組的代碼一樣快。此外,我通過將指針轉換爲調用中的引用來測試它,並且這也起作用。所以它將與動態分配的數組一起工作。