Возникли проблемы с назначением переменной устройства в CUDA - PullRequest
4 голосов
/ 29 июля 2011

У меня проблемы с попыткой присвоить значение переменной устройства и затем скопировать ее в переменную хоста.

Я начинаю с d_test и h_test = 0.0.У меня есть простое ядро, чтобы установить переменную устройства, d_test, в 1.0.Затем я копирую это в переменную хоста h_test и печатаю.Проблема в том, что при печати я получаю h_test = 0.0.Что я делаю неправильно?Вот код:

// -*- mode: C -*-
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>

// device variable and kernel
__device__ float d_test;
__global__ void kernel1(float d_test) { d_test = 1.0; }


int main() {

  // initialise variables
  float h_test = 0.0;
  cudaMemset(&d_test,0,sizeof(float));

  // invoke kernel
  kernel1 <<<1,1>>> (d_test);

  // Copy device variable to host and print
  cudaMemcpy(&h_test,&d_test,sizeof(float),cudaMemcpyDeviceToHost);
  printf("%f\n",h_test);  

}

Ответы [ 4 ]

6 голосов
/ 29 июля 2011

Есть несколько проблем с вашим кодом.

  1. Как правильно замечает pezcode, параметр d_test kernel1 скрывает вашу глобальную переменную, поэтому, когда она присваивается d_test, она фактически меняет значение своего параметра вместо глобальной переменной как Вы намерены kernel1 в этом примере не нужно принимать аргумент.

  2. Вместо cudaMemcpy используйте cudaMemcpyFromSymbol при копировании из глобальной переменной __device__.

Вот полное решение:

// -*- mode: C -*-
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>

// device variable and kernel
__device__ float d_test;
__global__ void kernel1() { d_test = 1.0; }

int main() {

  // initialise variables
  float h_test = 0.0;
  cudaMemset(&d_test,0,sizeof(float));

  // invoke kernel
  kernel1 <<<1,1>>> ();

  // Copy device variable to host and print
  cudaMemcpyFromSymbol(&h_test, "d_test", sizeof(float), 0, cudaMemcpyDeviceToHost);
  printf("%f\n",h_test);  
}

И вывод:

$ nvcc test.cu -run
1.000000
4 голосов
/ 14 марта 2012

cudaMemcpyFromSymbol работал для меня после долгой борьбы с cudaMemcpy и получения неправильных значений.Я должен был удалить кавычки вокруг "d_test" и получил ошибку неверного аргумента с cudaMemset, поэтому просто использовал cudaMalloc, который был ранее в коде.

1 голос
/ 29 июля 2011

Я предполагаю, что kernel1 изменяет свой параметр d_test, поскольку скрывает глобальную переменную device .Переименуйте один из них или, если это работает с CUDA, явно используйте глобальную область видимости, установив :: d_test.

0 голосов
/ 21 февраля 2015

этот код у меня нормально работает. ключ там.

вторая переменная должна быть такой \ n

cudaMemcpyFromSymbol (& h_test, d_test, sizeof (float), 0, cudaMemcpyDeviceToHost);

и затем скомпилируйте свой код с помощью
nvcc -Xcompiler -arch = sm_30 sample.cu -o sample.exe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...