Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将结构的动态数组传递给GPU内核_C++_Cuda_Structure_Dynamic Memory Allocation - Fatal编程技术网

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?在这种情况下内存释放的效果如何?请参考我链接的重复问题,并研究链接的示例。您复制了指针,但没有复制它们指向的实际数据。如果您仍然需要帮助,请提出新问题。此问题已得到回答。因此,如果您继续修改问题,也不是聊天室当你在回答中加入反馈时,你会感到非常困惑。