10

オンラインドキュメントから:

cudaError_t cudaMemset (void * devPtr, int value, size_t count )

devPtrが指すメモリ領域の最初のカウントバイトを定数バイト値で埋めます。

パラメータ:devPtr-デバイスメモリ値へのポインタ-指定されたメモリカウントの各バイトに設定する値-設定するバイト単位のサイズ

この説明は次のように正しくないようです。

int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);

32個の整数すべてを0x12121212ではなく0x12に設定します。(整数vsバイト)

説明では、バイトの設定について説明しています。カウントと値はバイト単位で記述されます。countはsize_t型であり、valueはint型です。つまり、バイトサイズをint値に設定します。

cudaMemset()はprogガイドに記載されていません。私は私が見ている振る舞いが正しいと仮定しなければなりません、そしてドキュメンテーションは悪いです。

そこにもっと良いドキュメントソースはありますか?(どこで?)
他のタイプはサポートされていますか?つまり、float *dJunk;動作しますか?その他?

4

1 に答える 1

19

ドキュメントは正しく、何をするかについてのあなたの解釈cudaMemsetは間違っています。関数は実際にバイト値を設定します。あなたの例では、最初の 32バイト0x12に設定しますが、32 個の整数すべてを に設定するわけではありません0x12

#include <cstdio>

int main(void)
{
    const int n = 32;
    const size_t sz = size_t(n) * sizeof(int);
    int *dJunk;
    cudaMalloc((void**)&dJunk, sz);
    cudaMemset(dJunk, 0, sz);
    cudaMemset(dJunk, 0x12, 32);

    int *Junk = new int[n];

    cudaMemcpy(Junk, dJunk, sz, cudaMemcpyDeviceToHost);

    for(int i=0; i<n; i++) {
        fprintf(stdout, "%d %x\n", i, Junk[i]);
    }

    cudaDeviceReset();
    return 0;
}

生産する

$ nvcc memset.cu 
$ ./a.out 

0 12121212
1 12121212
2 12121212
3 12121212
4 12121212
5 12121212
6 12121212
7 12121212
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0

すなわち。すべての 128 バイトが 0 に設定され、次に最初の 32 バイトが に設定され0x12ます。ドキュメントで説明されているとおりです。

于 2012-11-14T21:43:44.120 に答える