【发布时间】:2015-07-16 23:01:02
【问题描述】:
我在将结构数组传递给 gpu 内核时遇到问题。我基于这个话题 - cudaMemcpy segmentation fault 写了这样的东西:
#include <stdio.h>
#include <stdlib.h>
struct Test {
char *array;
};
__global__ void kernel(Test *dev_test) {
for(int i=0; i < 5; i++) {
printf("Kernel[0][i]: %c \n", dev_test[0].array[i]);
}
}
int main(void) {
int n = 4, size = 5;
Test *dev_test, *test;
test = (Test*)malloc(sizeof(Test)*n);
for(int i = 0; i < n; i++)
test[i].array = (char*)malloc(size * sizeof(char));
for(int i=0; i < n; i++) {
char temp[] = { 'a', 'b', 'c', 'd' , 'e' };
memcpy(test[i].array, temp, size * sizeof(char));
}
cudaMalloc((void**)&dev_test, n * sizeof(Test));
cudaMemcpy(dev_test, test, n * sizeof(Test), cudaMemcpyHostToDevice);
for(int i=0; i < n; i++) {
cudaMalloc((void**)&(test[i].array), size * sizeof(char));
cudaMemcpy(&(dev_test[i].array), &(test[i].array), size * sizeof(char), cudaMemcpyHostToDevice);
}
kernel<<<1, 1>>>(dev_test);
cudaDeviceSynchronize();
// memory free
return 0;
}
没有错误,但内核中显示的值不正确。我做错了什么?提前感谢您的帮助。
【问题讨论】:
-
为什么是
cudaMalloc((void**)&(test[i].array), size * sizeof(char));而不是cudaMalloc((void**)&(dev_test[i].array), size * sizeof(char));?另外,它应该是cudaMemcpy(dev_test[i].array, test[i].array, size * sizeof(char), cudaMemcpyHostToDevice);。 -
@francis,它不起作用(分段错误(核心转储))。在 gpu 上,我们无法以标准方式分配内存。
-
其他友好的建议:除非您了解提问者所面临的问题,否则不要从问题中选择代码......如果我的建议没有奏效,对不起。我的建议是为
dev_test[i].array分配内存,而不是为test[i].array分配内存,test[i].array = (char*)malloc(size * sizeof(char));已经在 CPU 上分配了内存。 -
@francis,没问题。是的
test[i].array已经分配,但只分配在 CPU 上,没有分配在 GPU 上。我们无法为dev_test[i].array分配内存,因为此内存仅对设备可见。至少我是这么理解的。
标签: c struct cuda dynamic-memory-allocation