2014-02-15 35 views
0

我可以訪問CUDA 6 RC作爲註冊開發人員,我想嘗試使用CUDA 6的新特性:統一內存。所以,我創建簡單的例子,當我嘗試使用此功能: 這裏是我的例子:CUDA 6:最簡單的樣本分割錯誤

#include <stdio.h> 
#include <cuda_runtime.h> 

int 
main(void) 
{ 
    int numElements = 5000; 
    size_t size = numElements * sizeof(float); 
    float *a; 
    cudaMallocManaged(&a, numElements); 

    for (int i = 0; i < numElements; ++i) 
    { 
     a[i] = rand()/(float)RAND_MAX; 
    } 


    return 0; 
} 

我試着運行它的例子,但我得到了分段錯誤:

Segmentation fault: 11

問題 - 什麼我做錯了?

+1

沒有'a'被分配了不正確的大小? – talonmies

+0

@talonmies我嘗試更改numElements在cudaMallocManaged中的大小,但沒有任何更改 - 我有相同的錯誤 - 分段錯誤。 – Dampir

回答

8

只要您有CUDA代碼的麻煩,你應該始終貫徹proper cuda error checking

如果你這樣做,我敢肯定你會看到從你cudaMallocManaged用作返回代碼錯誤「不支持的操作」呼叫。

統一內存支持僅在Kepler GPU上可用(此時)。請參閱附錄J中的CUDA_C_Programming_Guide.pdf文檔中的「統一存儲器編程」,這將是在/usr/local/cuda/doc/pdf目錄上一個標準的Linux安裝:

J.1.4. System Requirements

Unified Memory has three basic requirements:

•a GPU with SM architecture 3.0 or higher (Kepler class or newer)

•a 64-bit host application and operating system, except on Android

•Linux or Windows

所以,如果你是不是已經在使用一個切換到開普勒GPU,使用64位linux或windows(即不是MacOS),並確保使用指定的適當Kepler架構編譯代碼,例如-arch=sm_30

由於您的cudaMallocManaged呼叫失敗,因此a指針永遠不會被設置,任何隨後的操作都將導致seg故障。

而@talonmies指出,將您的分配大小從numElements更改爲您的計算size變量。

+0

Tnx,你的回答真的很有幫助!我試圖在Mac OS上使用cudaMallocManaged,這是失敗的原因! – Dampir