LINUX.ORG.RU

CUDAпроблемы

 ,


0

3

Возможно я чего-то не понимаю, но почему nvcc позволяет вот такое:

__constant__ int foo;

__host__ int hostf()
{
  return foo;
}

Это успешно компилируется и даже не падает с ошибкой в рантайме, а просто тихо и незаметно возвращает полную ерунду. Я бы на месте компилятора в этом месте ругался как сапожник.


в принципе как и gcc, а что не нравится то?

$ cat main.c 
#include <stdio.h>
const int tmp;
int main(int argc, char* argv)
{
  printf("tmp=%i\n",tmp);
  return 0;
}
$ gcc main.c -o run
$ ./run 
tmp=0

anonymous
()
Ответ на: комментарий от anonymous

а что не нравится то

То, что foo в памяти GPU лежит, я пытаюсь к нему обратиться с CPU и получаю ерунду, но никаких предупреждений нет.

dmfd
() автор топика
Ответ на: комментарий от dmfd

Книга «Основы технологии CUDA». А.М.Казённов

Константная память используется тогда, когда в ядро необходимо передать много различных данных, которые будут одинаково использоваться всеми тредами ядра.

Константная — память, располагающаяся в микросхемах DRAM, снабжена специальным константным кэшем. Используется для передачи в ядро аргументов, превышаюших допустимые размеры для параметров ядра (для чипа Fermi — 256 байт). Выделяется целиком на грид.

и потом, никто не мешает инициализировать её в процессе работы программы: cudaMemcpyToSymbol.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

глобальная переменная же, хотя константа - ну инициализируй, инициализируй её полностью ;)

Да инициализировал я её через cudaMemcpyToSymbol, просто не показал этот момент. И в ядре значение foo читается отлично. Дело не в этом же.

dmfd
() автор топика
Ответ на: комментарий от anonymous

Спасибо, анон, ну что бы я без тебя делал. А теперь объясни, почему обращение к памяти девайса с хоста (_не_ через cudaMemcpy) не вызывает у компилятора возмущения.

dmfd
() автор топика
Ответ на: комментарий от I-Love-Microsoft

P.S. Чтобы не было недопонимания, вот полный код теста:

#include <iostream>
#include <cuda.h>

__constant__ int foo;

__host__ int hostf()
{
  return foo;
}

__global__ void ker(int* i)
{
  i[0] = foo;
}

int main()
{
  int foo_ = 708;
  cudaError err = cudaMemcpyToSymbol("foo", &foo_, sizeof(foo_));
  if(err!=cudaSuccess)
    std::cout<<"Error:"<<cudaGetErrorString(err);

  std::cout<<"Fail expected: "<<hostf()<<"\n";

  dim3 sz(1);
  int* device;
  cudaMalloc(&device, sizeof(int));
  ker<<<sz, sz>>>(device);
  int host;
  cudaMemcpy(&host, device, sizeof(int), cudaMemcpyDeviceToHost);
  std::cout<<"\nhost:"<<host<<"\n";
  
  int bar_;
  err = cudaMemcpyFromSymbol(&bar_, "foo", sizeof(int));
  if(err!=cudaSuccess)
    std::cout<<"Error:"<<cudaGetErrorString(err);
  std::cout<<"708 expected: "<<bar_<<std::endl;
}
dmfd
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.