C++ 使用std::vector时使用cudamaloc()进行分配<;int*>;
我想用下面的代码来测试如何在GPU上通过指针进行分配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*>
#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;