9

コンスタントメモリを利用しようとしていますが、配列をネストする方法を理解するのに苦労しています。私が持っているのは、内部データのカウントを持つデータの配列ですが、それらはエントリごとに異なります。したがって、次の簡略化されたコードに基づいて、2つの問題があります。まず、データ構造のメンバーが指すデータを割り当てる方法がわかりません。次に、定数メモリにcudaGetSymbolAddressを使用できないため、グローバルポインタを渡すことができるかどうかわかりません(プレーンな__device__メモリでは実行できません)。


struct __align(16)__ data{
int nFiles;
int nNames;
int* files;
int* names;
};

__device__ __constant__ data *mydata;

__host__ void initMemory(...)
{
    cudaMalloc( (void **) &(mydata), sizeof(data)*dynamicsize );
    for(int i=; i lessthan dynamicsize; i++)
    {
        cudaMemcpyToSymbol(mydata, &(nFiles[i]), sizeof(int), sizeof(data)*i, cudaMemcpyHostToDevice);
        //...
        //Problem 1: Allocate & Set mydata[i].files
    }
}

__global__ void myKernel(data *constDataPtr)
{
    //Problem 2: Access constDataPtr[n].files, etc
}

int main()
{
    //...
    myKernel grid, threads (mydata);
}

提供された助けをありがとう。:-)

4

3 に答える 3

2

いいえ、できません。

コンスタント メモリ (最大 64KB) は、コンパイル前にのみハードコードできます。

ただし、デバイスにキャッシュされているテクスチャ メモリをオンザフライで割り当てることができます。

于 2011-02-25T09:38:03.993 に答える
0

いわゆる「パックされた」データ表現を使用しないのはなぜですか? このアプローチにより、必要なすべてのデータを 1 次元のバイト配列に配置できます。たとえば、保存する必要がある場合

struct data
{
    int nFiles;
    int nNames;
    int* files;
    int* names;
}

このデータを次のように配列に格納できます。

[struct data (7*4=28 bytes)
    [int nFiles=3 (4 bytes)]
    [int nNames=2 (4 bytes)]
    [file0 (4 bytes)]
    [file1 (4 bytes)]
    [file2 (4 bytes)]
    [name0 (4 bytes)]
    [name1 (4 bytes)]
]
于 2009-03-23T10:57:25.800 に答える