Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 用于重新分配cuda中不断增长的内存的函数_C++_C_Arrays_Cuda - Fatal编程技术网

C++ 用于重新分配cuda中不断增长的内存的函数

C++ 用于重新分配cuda中不断增长的内存的函数,c++,c,arrays,cuda,C++,C,Arrays,Cuda,我正在寻找一个函数来重新分配CUDA(设备)阵列,如果数据超出它的容器。背景是稀疏数据,我将其保存在数组中,从0开始,然后慢慢开始填充 我开始分配一个给定的号码开始: 在main()中: 然后我做了一些计算,h_dev中越来越多的块被用完了。如果使用了超过一半的阵列,我希望使阵列更大。我使用此函数来完成以下操作: void grow_array(float **ptr, int length, int length_new) { float *ptr_new; int width

我正在寻找一个函数来重新分配CUDA(设备)阵列,如果数据超出它的容器。背景是稀疏数据,我将其保存在数组中,从0开始,然后慢慢开始填充

我开始分配一个给定的号码开始:

在main()中:

然后我做了一些计算,h_dev中越来越多的块被用完了。如果使用了超过一半的阵列,我希望使阵列更大。我使用此函数来完成以下操作:

void grow_array(float **ptr, int length, int length_new)
{
    float *ptr_new;
    int width = length_new * (BLOCK_WIDTH - 4);
    int height= (BLOCK_HEIGHT- 4);
    HANDLE_ERROR(cudaMalloc(&ptr_new    , width * height * sizeof(float)));
    //this is the copy kernel
    dim3 threads(BLOCK_WIDTH-4,BLOCK_HEIGHT-4);
    dim3 blocks(length_new);
    copy_kernel<<<blocks,threads>>>(*ptr,ptr_new, length, length_new);

    float *old_ptr;
    old_ptr = *ptr;
    HANDLE_ERROR( cudaFree( old_ptr ) );
    *ptr = ptr_new;
}
复制内核如下所示:

__global__ void copy_kernel(float* old_vector, float* new_vector, int old_size, int new_size)
{
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = threadIdx.y;
    int offset_new = x + y * new_size * (BLOCK_WIDTH-4);
    int offset_old = x + y * old_size * (BLOCK_WIDTH-4);
    if (blockIdx.x < old_size)
    {
        new_vector[offset_new] = old_vector[offset_old];
    }
    else
    {
        new_vector[offset_new] = 42.0f;
    }
}
\uuuuu全局\uuuuuu无效复制\u内核(浮点*旧向量,浮点*新向量,整数旧大小,整数新大小)
{
intx=blockIdx.x*blockDim.x+threadIdx.x;
int y=threadIdx.y;
int offset_new=x+y*新尺寸*(块宽度-4);
int offset_old=x+y*旧尺寸*(块宽度-4);
if(块IDX.x<旧尺寸)
{
新向量[offset\u new]=旧向量[offset\u old];
}
其他的
{
新矢量[偏移量新]=42.0f;
}
}

我最初是在使用malloc和free(非CUDA)的原型之后写这篇文章的,该原型似乎可以工作。然而,这会导致我的程序崩溃,并提示内存访问超出范围。我很确定我遗漏了一些引用/取消引用问题,但无法找到问题的确切位置。是否有任何指向此失败原因的指针?

用新的、更大的指针替换指针的代码显然不是越界错误的原因,尽管它触发了越界错误。在一个不相关的内核中发现错误并修复了它。谢谢大家。

您可能需要显示所有相关代码。例如,启动由二维螺纹块组成的一维网格似乎有些奇怪。您当然可以这样做,但这会引起一些问题,关于您如何在
copy\u内核中计算索引,您没有显示这些问题。如果您指的是设备越界地址,最好显示设备代码。关于“使我的程序崩溃”你能说得更清楚些吗?这是指seg故障还是其他故障?你试过cuda memcheck吗?请显示其他人可以编译和运行的完整应用程序。是的,这需要努力。在围绕所显示的内容构建代码时(
grow\u array
memory\u manager
)。它似乎工作正常。如果你需要帮助,请提供一个完整的例子,就像我所做的那样。投票结束。亲爱的克罗维拉先生,感谢您抽出时间发表评论。我已经包括了有问题的复制内核。我并没有在一开始就添加它,因为在另一个内核中会产生出越界错误,如果我使用的是“静态”内存大小的话,这个错误可以正常工作。这让我相信代码中的内存管理部分可能有一个明显的错误。当我将您的
copy_内核
插入我的工作代码时,它在偏移量4096处产生故障。我敢打赌,如果你像我一样尝试创建一个简化的示例,你会很快发现问题。当然,我怀疑你的复制内核,但我还没有整理好你的索引。我会尽量简化你的建议,并让你的例子运行。关于索引:它就像一个1d数组,其中每个元素都是内核的数据块。所以高度是块的高度(4是因为光环元素)。宽度是块数*乘以块宽度(同样为-4)。
void memory_manager(int &blocks_available, int blocks_used, float** h_dev)
{
    double ratio = (double)blocks_used/(double)blocks_available;
    if (ratio > 0.5)
    {
        int new_length = 1.5 * blocks_available;
        grow_array(h_dev , blocks_available, new_length);
        (...)
    {
{
__global__ void copy_kernel(float* old_vector, float* new_vector, int old_size, int new_size)
{
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = threadIdx.y;
    int offset_new = x + y * new_size * (BLOCK_WIDTH-4);
    int offset_old = x + y * old_size * (BLOCK_WIDTH-4);
    if (blockIdx.x < old_size)
    {
        new_vector[offset_new] = old_vector[offset_old];
    }
    else
    {
        new_vector[offset_new] = 42.0f;
    }
}