c++ - 段错误 C++ Cuda

标签 c++ cuda

我是一名 Java 程序员,刚接触 C++ 和 Cuda。我在执行以下操作时遇到段错误:

输入.h 类输入 {

public:
    const LucyDecimal * sellingPrice; //Ri
    const LucyDecimal qc;

public:
    Input(
            const LucyDecimal * _sellingPrice, 
            const LucyDecimal _qc);

    virtual ~Input();

};

输入.cpp

Input::Input(
        const LucyDecimal * _sellingPrice, //Ri
        const LucyDecimal _qc):sellingPrice(_sellingPrice),qc(_qc)
{};

Input::~Input() {
}

现在在我的 CudaRun.cu

void mainRun(Input in) {
    Input *deviceIn;
    deviceIn = new Input(NULL, NULL, NULL, NULL, 0.0, NULL,0.0,0.0,NULL,0.0,NULL,0.0);
    //line-a

    printf("Started. Just abt to call cuda \n");
    int size = sizeof(Input);
    cudaMalloc((void**) &deviceIn, size);
    cudaMemcpy(deviceIn, &in, size, cudaMemcpyHostToDevice);

    cudaMalloc((void**) deviceIn->sellingPrice, 4 * sizeof(LucyDecimal));
    //line-b
        ....
}

我在 line-b 处遇到段错误。它与 line-a 初始化有关吗?

最佳答案

您不必创建指向设备内存的指针:

cudaMalloc((void**) &deviceIn, size);

然后在主机代码中取消引用该指针:

cudaMalloc((void**) deviceIn->sellingPrice, 4 * sizeof(LucyDecimal));

要在 deviceIn 结构中实际设置 sellingPrice 指针的值,编译器必须取消引用从基指针计算的指针 (deviceIn) 以便写入分配的指针值,并且这种取消引用在主机代码中是非法的。

复制包含指针的结构称为“深复制”,这有点乏味。

相反,您需要分配一个单独的指针:

LucyDecimal * sellingPrice_temp;
cudaMalloc((void**) &sellingPrice_temp, 4 * sizeof(LucyDecimal));

然后在适当的位置将分配的指针从主机复制到设备:

cudaMemcpy(&(deviceIn->sellingPrice), &sellingPrice_temp, sizeof(LucyDecimal *), cudaMemcpyHostToDevice);

请注意,找到结构中特定位置的地址 (&(deviceIn->sellingPrice)) 是编译器可以计算的内容,无需取消引用基指针 (deviceIn)。

如果您想在某个时候将数据从该嵌入式指针区域复制回主机,您将需要再次使用 sellingPrice_temp

这个话题出现的频率很高,如果你搜索,你可以找到很多其他的例子。 “CUDA 复制结构嵌入指针”。该方法类似于将双下标 (**) 动态分配的矩阵从主机复制到设备。

我还推荐 proper cuda error checking尽管在这种情况下它不会很有指导意义。

关于c++ - 段错误 C++ Cuda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22782897/

相关文章:

c++ - 在无限循环中每 60 秒重置一次变量值

c++ - 元编程 : using a const array

c++ - C++中的数组声明而不指定大小

c++ - 构建 CUDA/C++ 代码时链接器错误

memory - 合并访问模式对 CUDA 中的纹理和表面内存很重要吗?

c++ - 如何在使用 Windows API 下载文件时创建进度条?

c++ - 从 body 提取掩码计算边界框

c++ - CUDA 应用程序 .exe 已停止工作

sorting - 使用 Thrust 库基数排序进行 CUDA 编程

c - 在cuda中执行一次部分代码