この方法で構造体を定数メモリにコピーしようとしていました:
struct Foo {
int a, b, c;
};
__constant__ Foo cData;
int main() {
Foo hData = {1, 2, 3};
cudaMemcpyToSymbol(cData, &hData, sizeof(Foo));
// ...
}
私のカーネルでは、定数データに直接アクセスできました。
__global__ void kernel() {
printf("Data is: %d %d %d\n", cData.a, cData.b, cData.c); // 1 2 3
}
const char *
しかし、シンボル名として使用しようとすると、動作が停止しました。
cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0
どちらのバージョンも似ていると思っていましたが、間違っていたようです。
何が起こっている?
編集: cudaGetSymbolAddress でこの同じ動作を報告したいと思います。これは、noconst char *
が使用されている場合に機能します。
__constant__ int someData[10];
__constant__ int *ptrToData;
int *dataPosition;
cudaGetSymbolAddress((void **)&dataPosition, someData); // Works
// cudaGetSymbolAddress((void **)&dataPosition, "someData"); // Do not work
cudaMemcpyToSymbol(ptrToData, &dataPosition, sizeof(int *));