Я пытался скопировать структуру в постоянной памяти таким образом:cudaMemcpyToSymbol, используя или не используя строку
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
Я думал, что обе версии были похожи, но, похоже, я ошибся.
Что происходит?
EDIT: Я хотел бы сообщить такое же поведение с cudaGetSymbolAddress, который работает для меня, если нет const 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 *));
Ооооо, я пропустил это! Благодаря! :) – AkiRoss