Cuda C++ Доступ к структуре из глобальной памяти устройства в ядре приводит к несанкционированному доступу к памятиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Cuda C++ Доступ к структуре из глобальной памяти устройства в ядре приводит к несанкционированному доступу к памяти

Сообщение Anonymous »

Я работал над более крупной программой, используя набор инструментов Nvidia Cuda, но продолжал получать ошибки несанкционированного доступа к памяти. В итоге я локализовал проблему в доступе к структуре, однако, насколько я понял, структура и все элементы структур были размещены на устройстве, поэтому не должно было быть несанкционированного доступа к памяти.
Этот пример программы работает нормально, выводит правильное значение и завершает работу без ошибок:

Код: Выделить всё

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include 

#include 

struct test_struct {
int* arr;

void allocate(int size);

void deallocate();
};

void test_struct::allocate(int size) {
cudaMalloc((void**)&arr, size);
}

void test_struct::deallocate() {
cudaFree(arr);
}

__device__ struct test_struct* d_struct;

__global__ void print_arr(test_struct* test) {
printf("%d\t", test->arr[0]);
}

int main()
{
cudaMalloc((void**)&d_struct, sizeof(test_struct));

test_struct* h_test;
h_test = (test_struct*)malloc(sizeof(test_struct));
h_test->allocate(64 * sizeof(int));

cudaMemcpy(d_struct, h_test, sizeof(test_struct), cudaMemcpyHostToDevice);

print_arr  > (d_struct);
std::cout deallocate();
free(h_test);
cudaFree(d_struct);

return 0;
}

Однако изменение метода print_arr на:

Код: Выделить всё

__global__ void print_arr() {
printf("%d\t", d_struct->arr[0]);
}
и соответствующее обновление основного метода print_arr ();
вызывает незаконный доступ к памяти . Остальная часть кода точно такая же, но вместо доступа к структуре через глобальную память мы передаем ее непосредственно в метод. Итак, мой вопрос: почему первый код работает нормально, но изменение его на использование глобальной памяти приводит к сбою? Насколько я понимаю, указатель на массив arr в обоих случаях один и тот же.

Подробнее здесь: https://stackoverflow.com/questions/790 ... llegal-mem
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»