相关疑难解决方法(0)

使用CUDA运行时API检查错误的规范方法是什么?

查看有关CUDA问题的答案和评论,以及CUDA标记维基,我发现通常建议每个API调用的返回状态都应该检查错误.API文档包括像功能cudaGetLastError,cudaPeekAtLastError以及cudaGetErrorString,但什么是把这些结合在一起,以可靠地捕捉和无需大量额外的代码报告错误的最好方法?

cuda error-checking

252
推荐指数
4
解决办法
9万
查看次数

cudaMemcpy分段错误

我已经被这个错误困扰了很长一段时间所以我决定在这里发布它.

调用cudaMemcpy时发生此分段错误:

CurrentGrid->cdata[i] = new float[size];
cudaMemcpy(CurrentGrid->cdata[i], Grid_dev->cdata[i], size*sizeof(float),\
                cudaMemcpyDeviceToHost);
Run Code Online (Sandbox Code Playgroud)

CurrentGrid并且Grid_dev分别指向grid主机和设备上的类对象,在此上下文中i = 0.类成员cdata是一个浮点类型指针数组.为了调试,这cudaMemcpy调用之前对的,我打印出来的每个元素的值Grid_Dev->cdata[i],地址CurrentGrid->cdata[i]Grid_dev->cdata[i]和的价值size,这一切看起来不错.但它仍然以"分段故障(核心转储)"结束,这是唯一的错误消息.cuda-memcheck只给出了"进程没有成功终止".我目前无法使用cuda-gdb.关于去哪儿的任何建议?

更新:现在看来我已经通过cudaMalloc解决了这个问题,设备上的另一个浮点指针A和cudaMemcpy的Grid_dev-> cdata [i]的值为A,然后是cudaMemcpy A来主机.所以上面写的代码段变成:

float * A;
cudaMalloc((void**)&A, sizeof(float));
...
...
cudaMemcpy(&A, &(Grid_dev->cdata[i]), sizeof(float *), cudaMemcpyDeviceToHost);    
CurrentGrid->cdata[i] = new float[size];
cudaMemcpy(CurrentGrid->cdata[i], A, size*sizeof(float), cudaMemcpyDeviceToHost);            
Run Code Online (Sandbox Code Playgroud)

我之所以这样做是因为valgrind突然出现了"8号无效读取",我认为这是指的Grid_dev->cdata[i].我用gdb再次检查它,打印出Grid_dev->cdata[i]NULL值.所以我想即使在这个cudaMemcpy调用中也无法直接取消引用设备指针.但为什么 ?根据这个帖子底部的评论,我们应该能够在cudaMemcpy函数中取消引用设备指针.

另外,我不知道cudaMalloc和cudaMemcpy如何工作的基本机制,但我认为cudaMalloc是一个指针,比如A,我们实际上指定这个指针指向设备上的某个地址.并且通过cudaMemcpy Grid_dev->cdata[i]到A,如上面的修改代码,我们重新分配指针A指向数组.那么,当它是cudaMalloced时,我们不会失去A指向的先前地址的轨道吗?这会导致内存泄漏吗?如果是的话,我应该如何妥善解决这种情况?谢谢!

作为参考,我将完整函数的代码放在下面发生此错误的代码中.

非常感谢!

__global__ void Print(grid *, int);
__global__ void Printcell(grid *, int);
void CopyDataToHost(param_t p, grid …
Run Code Online (Sandbox Code Playgroud)

c++ cuda segmentation-fault

9
推荐指数
1
解决办法
8213
查看次数

如何使用cudaMalloc/cudaMemcpy作为指向包含指针的结构的指针?

我看过这个网站和其他人,并没有任何效果.我正在为我的具体案例提出问题.

我有一堆矩阵,目标是使用内核让GPU对所有矩阵执行相同的操作.我很确定我可以让内核工作,但我不能让cudaMalloc/cudaMemcpy工作.

我有一个指向Matrix结构的指针,它有一个名为elements的成员,指向一些浮点数.我可以做所有非cuda mallocs就好了.

感谢您的帮助.

码:

typedef struct {
    int width;
    int height;
    float* elements;
} Matrix;

int main void() {
    int rows, cols, numMat = 2; // These are actually determined at run-time
    Matrix* data = (Matrix*)malloc(numMat * sizeof(Matrix));

    // ... Successfully read from file into "data" ...

    Matrix* d_data;
    cudaMalloc(&d_data, numMat*sizeof(Matrix)); 
    for (int i=0; i<numMat; i++){
        // The next line doesn't work
        cudaMalloc(&(d_data[i].elements), rows*cols*sizeof(float));

        // Don't know if this works
        cudaMemcpy(d_data[i].elements, data[i].elements,  rows*cols*sizeof(float)), cudaMemcpyHostToDevice);
    }

    // ... Do …
Run Code Online (Sandbox Code Playgroud)

pointers cuda

0
推荐指数
1
解决办法
1万
查看次数

标签 统计

cuda ×3

c++ ×1

error-checking ×1

pointers ×1

segmentation-fault ×1