嗨,我有以下代码......
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视为一维数组(考虑到每个元素的大小不同)?
答案 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);
...
}