【问题标题】:c size of one array to anotherc 一个数组到另一个数组的大小
【发布时间】:2010-12-30 14:10:42
【问题描述】:

您好,我有以下代码...

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,就好像它是一维数组一样(考虑到每个元素都有不同的大小)?

【问题讨论】:

    标签: c arrays malloc cuda


    【解决方案1】:

    如果您有一个常规的 2D 字符数组,您可以使用...计算大小...

    width * height * sizeof(char)
    

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

    【讨论】:

    • 所以你的意思是,例如,如果我有 200 个元素,并且所有这些元素的字符总数等于 N,那么 size_t size = 200*N*sizeof(char); ?
    • 我想是的。我在想一张 1024x1024 的数码图片。它有 1024 行,每行有 1024 个元素。元素总数为1024*1024。
    • 假设我有以下图片,其中我的数组只有三个元素。 a[0] 存储 15 个字符,a[1] 存储 3 个字符,a[2] 存储 5 个字符。所以元素的总数变成了15+3+5。是吗?还是 (15+3+5)*sizeof(char)?
    • 是后者,(15 + 3 + 5)*sizeof(char)
    • 如果元素的长度不同,那么 sizeof(char) * width * height 不起作用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为您正在研究如何获取指针 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);
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 2015-12-09
        • 2020-02-19
        • 1970-01-01
        • 2019-07-24
        相关资源
        最近更新 更多