【问题标题】:Segmentation Fault C++ Cuda分段错误 C++ Cuda
【发布时间】:2014-04-01 10:16:21
【问题描述】:

我是一名 Java 程序员,不熟悉 C++ 和 Cuda。我在下面遇到分段错误:

Input.h 类输入 {

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

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

    virtual ~Input();

};

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 初始化有关吗?

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

    您无法创建指向设备内存的指针:

    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,尽管在这种情况下它不会很有启发性。

    【讨论】:

    • 但是sellingPrice_temp 将如何获得价值呢?
    • sellingPrice_temp is set by cudaMalloc 操作的指针值,我在我的答案中列出,就在sellingPrice_temp 的声明之后,就像在主机代码中一样,malloc 操作返回一个指针值。
    • 你的这个答案有帮助:stackoverflow.com/questions/22156536/… 但在那个答案中,你没有为结构做cudeMemcpy。那么它如何获得foo
    • 结构在设备上分配。如果要将结构内容从主机复制到设备,那很好。没有必要在那个答案中证明这一点。为了从主机到设备获取foo 值,您可以复制结构。然而,如果你这样做,复制结构,然后然后设置你的sellingPrice指针,否则结构复制将覆盖sellingPrice指针。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多