2013-09-20 3 views
0

У меня возникли проблемы с использованием cudaMemcpyToSymbol. У меня есть код, который работает отлично. Версия урезывание моего кода заключается в следующем:CUDA: cudaMemcpyToSymbol не копирует данные

mykernel.h file: 
__global__ 
void foo(float* out); 

mykernel.cu file: 
#include "kernels.h" 
__global__ 
void foo(float* out) 
{ 
    uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x; 
    out[idx] = 10; 
} 

main.cu file: 
#include "kernels.h" 
main() 
{ 
    // initialization and declaration stuff here 

    foo<<<1,1,1>>>(my_global_memory); 

    // read back global memory and investigate values 
} 

Приведенный выше код работает просто отлично. Теперь я хочу заменить это значение «10» значением, полученным из постоянной памяти. Так что я сделал, чтобы:

  • Добавить __constant__ float my_const_var; в mykernel.h файл.
  • заменить последнюю строку моего ядра с out[idx] = my_const_var; в mykenel.cu
  • добавить float value = 10.0f; cudaMemcpyToSymbol(my_const_var,&value); до моего вызова в main.cu

После того, как сделали все, что он выглядит как cudaMemcpyToSymbol не копирует фактическое значение потому что я получаю результат «0» вместо «10». Кроме того, я всегда проверяю ошибки CUDA и их нет. Может ли кто-нибудь сказать мне, что я делаю неправильно? И почему cudaMemcpyToSymbol не копирует значение в символ? Я использую GeForce9600M (вычислительная способность 1.1) с последними драйверами в Debian Linux и CUDA SDK 5.0. Я также попытался запустить cuda-memcheck, и у меня нет ошибок.

ответ

2

Поскольку вы пытаетесь получить доступ к переменной в одном модуле компиляции, который определен в другом модуле компиляции (main.cu и mykernel.cu), для этого потребуется separate device compilation.

До версии 5.0, CUDA не поддерживает раздельную компиляцию, поэтому CUDA код не может вызывать функции устройства или переменные доступа через файлы.

К сожалению, отдельная компиляция доступна только для устройств с вычислительной мощностью 2.0 или выше.

Отдельный сборник работает только для sm_20 и выше,

Вы можете работать вокруг этого для предварительного cc2.0, поставив весь код CUDA, который должен ссылаться на данную переменную в том же файла (тот же файл, где объявлена ​​переменная).

+0

Должен сказать, что я не знал об этом. Отлично, теперь это работает. – AstrOne

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