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

1次元配列であるかのようにtに対してcudaMallocを実行する方法(各要素のサイズが異なることを考慮に入れて)?

4

3 に答える 3

2

文字の通常の2D配列がある場合は、次のようにサイズを計算できます...

width * height * sizeof(char)

不規則な2D配列(一部の行の長さが異なる)がある場合は、cudaMallocを実行する前に、別の場所にある文字の総数を追跡するか、ループして文字数を数える必要があります。

于 2009-12-28T20:21:46.387 に答える
1

私があなたを正しく理解していれば、すべての小さな malloc の合計を malloc するだけです。

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 に答える