CUDA struct中指向数组的cudaFree指针出现分段错误



我在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 );
}

语句:

status = cudaFree(d_dummy->arr);

要求解引用设备主机中的指针(d_dummy-它是由设备分配器即cudaMalloc分配的)代码。这在CUDA是非法的。

由于您已经知道(d_dummy->arr) == d_arr,释放嵌入指针的一种可能方法是:

status = cudaFree(d_arr);

一个类似的概念(在主机代码中取消对设备指针的引用)隐藏在这里的注释下面:

// for some reason this should happen here and not d_sp->coeff = d_coeff ...

最新更新