2012-06-21 77 views
4

我正在編寫CUDA程序的主機代碼,因此我使用標準C函數卡住了。我在使用memset函數初始化整數數組的元素時遇到問題。我的印象是,你可以使用memset初始化一個整數數組,例如,像這樣所有4S:使用memset和int值初始化整數數組 - 失敗

int num_elements = 10; 
int* array_example = (int*)malloc(num_elements * sizeof(int)); 
memset(array_example, 4, sizeof(array_example)); 

但是當我這樣做,它集每個字節,而不是每個int,4。如果我說:

memset(array_example, 4, 1); 

我在第一個整數得到一個4,如果我說:

memset(array_example, 4, 2); 

我在第二個第一整數和0獲得1024。我知道memset函數將第三個參數中指定的字節數設置爲4,但是有什麼方法可以使用memset將每個整數設置爲4而不是每個字節?否則,我堅持使用for循環?我的GPU具有較低的計算能力,因此我無法訪問允許使用更多C++的一些更好的CUDA附加組件。

回答

4

如果你知道一個表的大小和要設置的每個元素到一定值時,你可以寫:

int array[10] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; 

如果你使用gcc,你也可以做到這一點這樣:

int array[10] = {[0 ... 9] = 4}; 

當您必須動態分配數組時,我懷疑是否有任何替代解決方案,然後只使用一個簡單的循環。

+0

謝謝你,那太糟糕了。 – Blake

2

對於寫入整數的memset沒有標準的替代方法。你必須寫一個循環。

+0

好的,謝謝。我爲我的醫學影像研究繼承了5000多行程序,他們在整個地方使用了'memset',好像它可以初始化每個整數。他們的代碼有效,所以我試圖弄清楚我是否錯過了某些東西,或者他們幸運地寫過垃圾初始化。 – Blake

2

考慮到int本身的表示(例如2-complement),表示int值的位有一個字節爲每字節常量的模式,可以成功使用memset(不是幸運問題) 。例如,如果你使用4 memset數組,則事實證明每個int都用0x04040404初始化(考慮sizeof(int)= 32),根據你的需要,這可能是好的也可以不是。

這適用於整數初始化值的許多特定值。

但是,這導致幾乎不可移植的代碼。

它應該總是工作,如果你要初始化每個int爲零。

2

就好像我要補充一個選項,並有助於幾點:

  1. 如果你在C++中工作,而不是C,嘗試使用std::fill(),這是通用的 - 並讓對編譯器的擔心優化:

    std::fill_n(my_array, array_length, constant_value); 
    
  2. memset()的簽名是:

    void *memset(void *s, int c, size_t n); 
    

    雖然它假定需要一個int,它實際上期望一個(n無符號)字節值(即在00xFF之間)。

  3. 繼續tool's answer - 你可以做一些有用memset'ing這相當於使用(無符號)整數取決於sizeof(unsigned)設定數組爲0或至UINT_MAX,即,0xFFFF0xFFFFFFFF等。

  4. 如果我們有strided memset(),那麼可以將這兩個中的四個應用於4個字節的整數組中。但是,我們不這樣做,實際上看起來目前沒有什麼優勢可以通過循環來完成。