Этот пример программы работает нормально, выводит правильное значение и завершает работу без ошибок:
Код: Выделить всё
#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;
}
Код: Выделить всё
__global__ void print_arr() {
printf("%d\t", d_struct->arr[0]);
}
вызывает незаконный доступ к памяти . Остальная часть кода точно такая же, но вместо доступа к структуре через глобальную память мы передаем ее непосредственно в метод. Итак, мой вопрос: почему первый код работает нормально, но изменение его на использование глобальной памяти приводит к сбою? Насколько я понимаю, указатель на массив arr в обоих случаях один и тот же.
Подробнее здесь: https://stackoverflow.com/questions/790 ... llegal-mem