c一个数组到另一个数组的大小

时间:2009-12-28 20:17:55

标签: c arrays malloc cuda

嗨,我有以下代码......

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视为一维数组(考虑到每个元素的大小不同)?

3 个答案:

答案 0 :(得分:2)

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

width * height * sizeof(char)

如果您有一个不规则的2D数组(某些行具有不同的长度),那么您必须跟踪其他地方的字符总数或循环并计算您在执行cudaMalloc之前有多少个字符。

答案 1 :(得分:1)

如果我理解正确,你只需要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;
}

答案 2 :(得分: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);
  ...
}