Массивы локальных указателей в глобальной функции CUDA - PullRequest
0 голосов
/ 02 апреля 2012

Я новичок в CUDA. Может кто-нибудь объяснить мне, пожалуйста, почему этот код является недействительным? Я пытаюсь запустить его на видеокарте GT240, и средство проверки памяти показывает мне ошибку нарушения доступа в строке с buf [0] [0].

Вот код:

__global__ void addKernel(char *c)
{
    int i = threadIdx.x;

    if(i < 1) {
        char* buf[2];
        char some[3] = "ab";
        char another[3] = "cd";

        buf[0] = some;
        buf[1] = another;

        c[i] = buf[0][0];
    }
}

Спасибо.

UPDATE: Возможное решение для вычисления чего-либо в одной функции и передачи результатов другой функции - это сохранение данных в глобальной памяти (вычисление 1.x), например:

__device__ char* buf[2];
__device__ char some[3];
__device__ char another[3];

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;

    if(i < 1) {
        some[0] = 'a';
        some[1] = 'b';

        another[0] = 'c';
        another[1] = 'd';

        buf[0] = some;
        buf[1] = another;

        buf[0][0] = 'b';
        c[i] = 1;
        }
}

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Это классическая проблема висячий указатель , усугубленная тем, что на вашем GT240 buff будет храниться в регистрах или локальной памяти, а c в глобальной памяти. Указатели не переносимы в устройствах compute 1.x.

То, что вы пытаетесь сделать, является незаконным, по крайней мере, двумя различными способами в имеющейся у вас модели / оборудовании программирования, и никогда не сможет работать.

1 голос
/ 02 апреля 2012

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

Предложения:

  1. char * c указывает на неверный адрес,или
  2. какая-то странная ошибка компилятора в используемом вами компиляторе не может инициализировать char some[3] - попробуйте разбить ее на более простые операторы присваивания, или
  3. Возможность threadIdx.xбыть отрицательным?т.е. если threadIdx.x равен -1, тогда c [i] равно c [-1], что может быть недопустимо ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...