2009-12-28 92 views
0

您好,我有以下代碼...C尺寸到另一個

int *a, *b; 
    int *d; 
    int N = 2000; 
    size_t size = N*sizeof(int); 

    a = (int *) malloc(size); 
    b = (int *) malloc(size); 
    ... 
    cudaMalloc((void **) &d, size); 

它工作得很好......現在假設我有以下

char **t = malloc(2000* sizeof *t); 
    for(...) 
    { 
    ... 
    t[i] = (char *)malloc(sizeof(char)*changing_length); 
    ... 
    } 

怎麼辦cudaMalloc對於t就好像它是一維數組(考慮到每個元素具有不同的大小)?

回答

1

如果你有字符的常規二維數組,你可以計算與大小...

width * height * sizeof(char) 

如果你有一個不規則的二維數組(某些行有不同的長度),那麼你就必須要麼跟蹤其他地方的字符總數或循環遍數,並計算在執行cudaMalloc之前有多少個字符。

+0

所以你的意思是,如果比如我有200個元素,所有論文的字符總數的元素讓我們說等於N,則 爲size_t大小= 200 * N *的sizeof(字符); ? – asel 2009-12-28 20:26:45

+0

我這麼認爲。我正在考慮一個1024x1024數字圖片。它有1024行,每行有1024個元素。元素的總數是1024 * 1024。 – Pace 2009-12-28 20:29:23

+0

讓'說我有以下圖片,我的數組只有三個元素。 a [0]存儲15個字符,a [1]存儲3個字符,並且[2]存儲5個字符。所以元素總數變成15 + 3 + 5。是嗎?還是(15 + 3 + 5)* sizeof(char)? – asel 2009-12-28 20:31:21

0

如果我理解正確的話,你只需要對malloc所有的小mallocs的SUM

char** t = malloc(2000 * sizeof(*t) + sizeof(char)*sum_of_changing_lengths); 

然後設置T [X]指向分配

char *p = (char*)(&t[2000]); 
for (...) 
{ 
    t[i] = p; 
    p += changing_length; 
} 
0

的後面部分我想你正在尋找如何獲得指針t [i]的地址。由於我不確定評估順序,我會嘗試&(t[i]),但是,&t[i]也應該起作用。如果兩者都不起作用,你必須自己計算指針位置。這將是像&t + i*sizeof *t

char **t = malloc(2000* sizeof *t); 
for(...) 
{ 
    ... 
    cudaMalloc((void **) &(t[i]), sizeof(char)*changing_length); 
    ... 
}