使用 cudaMalloc() 在使用 std::vector<int *时进行分配>
use cudaMalloc() to allocate when using std::vector<int *>
我想使用以下代码来测试如何通过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
类,可能是您实际追求的。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'