C++ 将结构的动态数组传递给GPU内核
我试图将结构的动态数组传递给内核,但它不起作用。我得到-“分段错误(核心转储)” 我的代码-已编辑C++ 将结构的动态数组传递给GPU内核,c++,cuda,structure,dynamic-memory-allocation,C++,Cuda,Structure,Dynamic Memory Allocation,我试图将结构的动态数组传递给内核,但它不起作用。我得到-“分段错误(核心转储)” 我的代码-已编辑 #include <stdio.h> #include <stdlib.h> struct Test { unsigned char *array; }; __global__ void kernel(Test *dev_test) { } int main(void) { int n = 4; int size = 5; unsig
#include <stdio.h>
#include <stdlib.h>
struct Test {
unsigned char *array;
};
__global__ void kernel(Test *dev_test) {
}
int main(void) {
int n = 4;
int size = 5;
unsigned char *array[size];
Test *dev_test;
// allocate for host
Test *test = (Test*)malloc(sizeof(Test)*n);
for(int i = 0; i < n; i++)
test[i].array = (unsigned char*)malloc(size);
// fill data
for(int i=0; i<n; i++) {
unsigned char temp[] = { 'a', 'b', 'c', 'd' , 'e' };
memcpy(test[i].array, temp, size);
}
// allocate for gpu
cudaMalloc((void**)&dev_test, n * sizeof(Test));
for(int i=0; i < n; i++) {
cudaMalloc((void**)&(array[i]), size * sizeof(unsigned char));
cudaMemcpy(&(dev_test[i].array), &(array[i]), sizeof(unsigned char *), cudaMemcpyHostToDevice);
}
kernel<<<1, 1>>>(dev_test);
return 0;
}
#包括
#包括
结构测试{
无符号字符*数组;
};
__全局无效内核(测试*开发测试){
}
内部主(空){
int n=4;
int size=5;
无符号字符*数组[大小];
测试*dev_测试;
//分配给主机
测试*测试=(测试*)malloc(sizeof(测试)*n);
对于(int i=0;i 对于(inti=0;i您需要为结构成员数组分配内存
Test *test = malloc(sizeof(Test)*n);
for(int i = 0; i < n; i++)
test[i]->array = malloc(size);
Test*Test=malloc(sizeof(Test)*n);
对于(int i=0;i阵列=malloc(大小);
我建议在此修复之后阅读以处理其他问题。您需要为结构成员数组
分配内存
Test *test = malloc(sizeof(Test)*n);
for(int i = 0; i < n; i++)
test[i]->array = malloc(size);
Test*Test=malloc(sizeof(Test)*n);
对于(int i=0;i阵列=malloc(大小);
我建议在此修复后阅读以解决其他问题。您的卡是什么?如果您的卡支持计算能力>=3.0,请尝试使用统一内存系统,以便在主机/设备内存中具有相同的数据
你可以看看
它应该看起来像这样:
int main(void) {
int n = 4;
int size = 5;
Test *test;
cudaMallocManaged(&test, n * size);
unsigned char values[] = { 'a', 'b', 'c', 'd' , 'e' };
for(int i=0; i<n; i++)
{
unsigned char* temp;
cudaMallocManaged(&temp, size*sizeof(char) );
memcpy(temp, values, sizeof(values) );
}
// avoid copy code, makes a deep copy of objects
kernel<<<1, 1>>>(test);
return 0;
}
int main(无效){
int n=4;
int size=5;
测试*测试;
CudamAllocManager(和测试,n*尺寸);
无符号字符值[]={a',b',c',d',e'};
对于(int i=0;i您的卡是什么?如果您的卡支持计算能力>=3.0,请尝试使用统一内存系统,以便在主机/设备内存中具有相同的数据
你可以看看
它应该看起来像这样:
int main(void) {
int n = 4;
int size = 5;
Test *test;
cudaMallocManaged(&test, n * size);
unsigned char values[] = { 'a', 'b', 'c', 'd' , 'e' };
for(int i=0; i<n; i++)
{
unsigned char* temp;
cudaMallocManaged(&temp, size*sizeof(char) );
memcpy(temp, values, sizeof(values) );
}
// avoid copy code, makes a deep copy of objects
kernel<<<1, 1>>>(test);
return 0;
}
int main(无效){
int n=4;
int size=5;
测试*测试;
CudamAllocManager(和测试,n*尺寸);
无符号字符值[]={a',b',c',d',e'};
对于(int i=0;i标准警告:请在C
中输入malloc()和族的返回值。此外,检查malloc()是否成功
返回后。@SouravGhosh虽然问题当前被标记为c
,但这里的上下文实际上是c++
。标准警告:请输入malloc()
的返回值和c
中的family。另外,检查malloc()是否成功
返回后。@SouravGhosh虽然问题当前被标记为c
,但这里的上下文实际上是c++
。当您修复了这个问题时,它确实是seg故障的根源(与CUDA无关),您将遇到这个代码的下一个问题(如果您试图在内核中使用数据)这将是所讨论内容的副本。@RobertCrovella;同意。@RobertCrovella,谢谢,我根据您的说明改进了代码。但是如何将数据从测试[I]。数组复制到dev_测试[I].array?在这种情况下内存释放的效果如何?请参考我链接的重复问题,并研究链接的示例。您复制了指针,但没有复制它们指向的实际数据。如果您仍然需要帮助,请提出新问题。此问题已得到回答。因此,如果您继续修改问题,也不是聊天室当你在回答中加入反馈时,这将是非常令人困惑的。当你修复了这个问题,它确实是seg故障的根源(与CUDA无关),你将遇到这个代码的下一个问题(如果你试图在内核中使用数据)这将是所讨论内容的副本。@RobertCrovella;同意。@RobertCrovella,谢谢,我根据您的说明改进了代码。但是如何将数据从测试[I]。数组复制到dev_测试[I].array?在这种情况下内存释放的效果如何?请参考我链接的重复问题,并研究链接的示例。您复制了指针,但没有复制它们指向的实际数据。如果您仍然需要帮助,请提出新问题。此问题已得到回答。因此,如果您继续修改问题,也不是聊天室当你在回答中加入反馈时,你会感到非常困惑。