0

嗨,我有以下代码...

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);
   ...
}

如何为 t 做 cudaMalloc 就好像它是一维数组(考虑到每个元素都有不同的大小)?

4

3 回答 3

2

如果你有一个常规的二维字符数组,你可以计算大小......

width * height * sizeof(char)

如果你有一个不规则的二维数组(有些行有不同的长度),那么你必须要么跟踪其他地方的字符总数,要么循环遍历并计算在执行 cudaMalloc 之前你有多少字符。

于 2009-12-28T20:21:46.387 回答
1

如果我理解正确,您只需要 malloc 所有较小 malloc 的 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;
}
于 2009-12-28T20:25:53.833 回答
1

我认为您正在寻找如何获取指针 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);
  ...
}
于 2009-12-28T20:32:13.207 回答