C++ 使用std::vector时使用cudamaloc()进行分配<;int*>;

C++ 使用std::vector时使用cudamaloc()进行分配<;int*>;,c++,pointers,cuda,gpu,C++,Pointers,Cuda,Gpu,我想用下面的代码来测试如何在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*>

我想用下面的代码来测试如何在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("Done\n");
    return 0;
}

我想在使用指针的过程中可能会出现一些错误,但我不确定为什么会发生这种情况。

您的向量
a
中没有任何元素。它是一个空向量<代码>一个[0]不存在

你可能想学习
std::vector
和它们的,它们与CUDA无关。请注意您正在使用的构造函数类型的第一个注意事项:

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

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

 vector<int*> a(5); 
向量a(5);

那我想你就能克服那个错误了。(例如,这为存储5个
int
指针分配了空间)

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

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;
模板<
T类,
类分配器=std::分配器
>类向量;
也就是说,它将分配器类作为模板参数。此类可能在GPU上执行分配。现在,C++标准库分配器机制被认为不是很好的设计或非常友好的使用,但它是可用的。试着写一个自定义的

H-o-w-e-v-e-r。。。这可能不是你想要的。在设备端代码中,你不能使用<代码> STD::vector < /Cord>,因为它的方法大部分都是HALLY,并且C++标准库中的大部分在设备上都不能工作/编译。
一个更相关的替代方案可能是使用库,它提供了标准库(如容器和通用算法)。“推力”有一个可能是你真正想要的。

如果目标是有一个包含设备指针的主机std::vector,那么这些有什么实际帮助?@Talonmes:第二个选项建议切换目标。第一个选项可以工作-分配器可以在引擎盖下的CUDA设备上使用allocate。也许我应该说得更清楚些。
template<
    class T,
    class Allocator = std::allocator<T>
> class vector;