使用 cudaMalloc() 在使用 std::vector<int *时进行分配>

use cudaMalloc() to allocate when using std::vector<int *>

本文关键字:int gt 分配 lt vector cudaMalloc std 使用      更新时间:2023-10-16

我想使用以下代码来测试如何通过Pointer在GPU上分配。

#include <stdio.h>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
    cudaError_t err = cudaSuccess;
    size_t numBytes;
    vector<int*> a;
    numBytes = 10 * sizeof(int);
    err = cudaMalloc((void**)&a[0], numBytes);
    if (err != cudaSuccess)
    {
        fprintf(stderr, "Failed to allocate device vector A (error code %s)!n", cudaGetErrorString(err));
        exit(EXIT_FAILURE);
    }
    printf("Donen");
    return 0;
}

我可以通过cmd: nvcc b.cu -o b.o成功编译它,但是当我通过cmd: ./b.o运行它时,我遇到了以下错误的消息:

Failed to allocate device vector A (error code invalid argument)!

我想使用指针期间有一些错误,但我不确定为什么会发生。

您的向量a中没有元素。它是一个空的向量。a[0]不存在。

您可能想研究std::vector及其构造函数,它们与CUDA无关。请注意您使用的构造函数类型的第一个注释:

1(默认构造函数。构建一个空容器。

如果将该向量定义为非零大小,例如:

 vector<int*> a(5); 

那么,我认为您将能够克服该错误。(例如,这为5 int指针的存储空间分配(

std::vector使用GPU设备上分配的内存,请记住其模板签名是:

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

也就是说,它将分配器类作为模板参数。该类可能会在GPU上执行分配。现在,C 标准库分配机构被认为不是很好地设计或非常友好,但它是可用的。尝试此(旧(教程编写自定义的教程。

H-O-W-E-V-E-R ...这可能不是您想要的。您将无法在设备端代码中使用std::vector,因为它的大多数方法都是宿主的,并且C 标准库中的大部分方法在设备上包含时都无法编译/无法编译。

可以使用更相关的替代方案,它可以使用推力库,该库提供了标准图书馆,例如容器和通用算法。推力有一个device_vector类,可能是您实际追求的。