【发布时间】:2021-05-22 20:44:05
【问题描述】:
我在 CUDA 设备上得到了一个结构,它包含一个指向数组的指针。计算、访问元素和一切正常,但是当我尝试成为一个好孩子并打电话时
cudaFree(my_struct->pointer_to_array)
我遇到了分段错误。 cudaFree(my_struct) 但是工作得很好。有什么我遗漏的吗?
请找到以下最小示例:
#include <stdio.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cassert>
typedef struct {
int n;
float *arr;
} DummyStruct;
__global__ void check(DummyStruct *d) {
printf("EL %f", d->arr[0]);
}
int main() {
cudaError_t status;
// create host pointer to dummy struct
DummyStruct *dummy;
dummy = (DummyStruct *)malloc(sizeof(DummyStruct));
int arr_size = 32;
dummy->n = 0;
float *arr = (float *) malloc(sizeof(float) * arr_size);
for (int i=0; i < 32; i++) {
arr[i] = i;
}
// allocate device array
float *d_arr;
status = cudaMalloc(&d_arr, arr_size * sizeof(float));
assert( status == cudaSuccess );
status = cudaMemcpy(d_arr, arr, arr_size * sizeof(float), cudaMemcpyHostToDevice);
assert( status == cudaSuccess );
free(arr);
// for some reason this should happen here and not d_sp->coeff = d_coeff ...
dummy->arr = d_arr;
// allocate and ship struct to device
DummyStruct* d_dummy;
status = cudaMalloc(&d_dummy, sizeof(DummyStruct));
assert( status == cudaSuccess );
status = cudaMemcpy(d_dummy, dummy, sizeof(DummyStruct), cudaMemcpyHostToDevice);
assert( status == cudaSuccess );
// free host struct
free(dummy);
// check whether array access works
check<<<1, 1>>>(d_dummy);
// THIS causes Segmentation fault (core dumped)
status = cudaFree(d_dummy->arr);
assert( status == cudaSuccess );
status = cudaFree(d_dummy);
assert( status == cudaSuccess );
}
【问题讨论】:
标签: c++ pointers struct cuda segmentation-fault