2013-03-15 3 views
2

Я пытался скопировать структуру в постоянной памяти таким образом: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 *)); 

ответ

8

По CUDA 5, используя строку для символьных имен больше не поддерживается. Это не рассматривается в релизе CUDA 5 отмечает here

• Использование строки символов для обозначения символа устройства, которое было возможно с некоторыми функциями API, больше не поддерживается. Вместо этого символ следует использовать напрямую.

Одна из причин этого связана с разблокирование истинного линкера устройства, которое является новым функциональность CUDA 5.

+0

Ооооо, я пропустил это! Благодаря! :) – AkiRoss

2

Из-за вновь и вновь получать ту же ошибку, я хочу поделиться этим пример кода, который показывает почти все примеры для этой проблемы (так что я могу сослаться на это позже, когда я снова сделаю такие же ошибки).

//file: main.cu 
#include <stdio.h> 
#include <stdlib.h> 
#include <cuda.h> 

__constant__ float constData[256]; 
__device__ float devData; 
__device__ float* devPointer; 

int main(int argc, char **argv) 
{ 
    cudaFree(0); 

    float data[256]; 
    cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data)); 
    printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err)); 

    float value = 3.14f; 
    err = cudaMemcpyToSymbol(devData, &value, sizeof(float)); 
    printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err)); 

    float* ptr; 
    cudaMalloc(&ptr, 256 * sizeof(float)); 
    err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr)); 
    printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err)); 
    cudaFree(ptr); 

    return EXIT_SUCCESS; 
} 

я получаю «символ недопустимого устройства» и многие другие, которые связаны с _ константой _ _устройство _ использования памяти. Этот код не дает таких ошибок во время выполнения.

Смежные вопросы