4

CUDAプログラムのホストコードを書いているので、標準のC関数を使用していません。memset関数を使用して整数配列の要素を初期化する際に問題が発生しました。memsetたとえば、整数配列を次のように4つすべてに初期化するために使用できるという印象を受けました。

int num_elements = 10;
int* array_example = (int*)malloc(num_elements * sizeof(int));
memset(array_example, 4, sizeof(array_example));

しかし、これを行うと、各バイトではなく、各バイトintが4に設定されます。

memset(array_example, 4, 1);

私は最初の整数で4を取得し、次のように言います。

memset(array_example, 4, 2);

最初の整数で1024、2番目の整数で0を取得します。関数が3番目のパラメーターで指定されたバイト数を4に設定することは理解していmemsetますが、memsetを使用して各整数を各バイトではなく4に設定する方法はありますか?それ以外の場合、forループを使用してスタックしていますか?私のGPUは計算能力が低いので、より多くのC++を使用できる優れたCUDA追加機能にアクセスできません。

4

4 に答える 4

4

テーブルのサイズがわかっていて、各要素を特定の値に設定したい場合は、いつでも次のように記述できます。

int array[10] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };

gccを使用する場合は、次の方法でもこれを行うことができます。

int array[10] = {[0 ... 9] = 4};

配列を動的に割り当てる必要がある場合、単純なループを使用するだけの代替ソリューションがあるとは思えません。

于 2012-06-21T09:20:01.867 に答える
3

intの値を表すビットが、int自体の表現(2の補数など)を考慮してバイト単位の定数であるパターンを持っている場合、memsetは正常に使用できます(幸運の問題ではありません)。

たとえば、配列を4でmemsetすると、各intは0x04040404(sizeof(int)= 32を考慮)で初期化されることがわかります。これは、必要に応じて問題ない場合もあります。

これは、整数の初期化値のいくつかの特定の値に適用されます。

しかし、これはほとんど移植性のないコードになります。

各intをゼロで初期化する場合は、常に機能するはずです。

于 2013-03-11T09:59:53.407 に答える
3

オプションを追加していくつかのポイントを提供しますが、次のようになります。

  1. CではなくC++で作業している場合は、std::fill()汎用のを使用してみてください。コンパイラに最適化について心配させてください。

    std::fill_n(my_array, array_length, constant_value);
    
  2. の署名memset()は次のとおりです。

    void *memset(void *s, int c, size_t n);
    

    おそらくはを取りますがint、実際には(n unsigned)バイト値(つまり0との間)を期待し0xFFます。

  3. 継続ツールの答え-(符号なし)intを使用することに相当するいくつかの便利なmemsetは、配列を0またはに設定します。UINT_MAXつまり、に応じて0xFFFFまたはなどに設定します。0xFFFFFFFFsizeof(unsigned)

  4. ストライドmemset()した場合は、これら2つのうち4つを適用して4バイトのintを配列に設定できます。ただし、そうではありません。実際、現在、ループするだけでそれを行うことに利点はないようです。

于 2013-07-24T14:51:54.797 に答える
2

整数を書き込むmemsetの標準的な代替手段はありません。ループを作成する必要があります。

于 2012-06-21T09:19:25.673 に答える