问题是:有没有办法在Cuda内核中使用类"向量"?当我尝试时,我收到以下错误:
error : calling a host function("std::vector<int, std::allocator<int> > ::push_back") from a __device__/__global__ function not allowed
Run Code Online (Sandbox Code Playgroud)
那么有一种方法可以在全局部分使用向量吗?我最近尝试了以下内容:
........之后我能够在我的Cuda内核中使用printf标准库函数.
有没有办法vector在内核代码中支持printf 的方式使用标准库类?这是在内核代码中使用printf的示例:
// this code only to count the 3s in an array using Cuda
//private_count is an array to hold every thread's result separately
__global__ void countKernel(int *a, int length, int* private_count)
{
printf("%d\n",threadIdx.x); //it's print the thread id and it's working
// vector<int> y;
//y.push_back(0); is there a possibility to do this? …Run Code Online (Sandbox Code Playgroud) 可能重复:
堆栈和堆的内容和位置
我在堆栈和堆上有几个问题.
要知道的基本事情是堆栈比堆快,但是有限.(如我错了请纠正我).
但是,我总是想知道堆栈和堆是如何工作的.RAM只是一块内存,它不分为'堆栈'和'堆'(或者是它?).如果是这样,为什么我们首先将堆栈和堆中的内存分开?
操作系统可以让我们能够分配堆栈中的所有内容 - >一切都变得更快 - >幸福的世界?
我很确定事实并非如此.但为什么!?谁能给我一个深入的答案?
很抱歉,如果这篇帖子是某人发过的一些帖子的副本,那么有很多与堆栈和堆相关的帖子,我找不到我所拥有的确切问题.如果您碰巧知道一个,请继续并将其链接.
我知道每个正在运行的进程都在虚拟内存中有与之关联的页面,其中很少会根据需要加载到主内存中.我也知道程序将有一个堆栈,也有一个堆来分配动态内存.这是我的问题.
你能推荐一本涵盖这些东西的好书吗?
我什么时候应该使用一个struct而不是一个类?我目前正在使用从OpenGL纹理包装到位图字体的所有类.
我使用的类就像一个struct(没有使用继承,多态等)仍然比一个慢struct?
我试图理解堆栈和堆内存之间的区别,这个问题在SO上以及这个解释做了很好的解释基础知识.
然而,在第二个解释中,我遇到了一个我有一个具体问题的例子,例子如下:

据说这个对象m是在堆上分配的,我只是想知道这是不是完整的故事.根据我的理解,对象本身确实在堆上分配,因为new关键字已用于其实例化.
但是,指向对象的指针m是不是在堆栈上分配的同一时间?否则,如何访问对象本身,当然它位于堆中.我觉得为了完整起见,本教程中应该提到这一点,留下它会给我带来一些混乱,所以我希望有人能够清楚地告诉我,我对我的理解是对的应该基本上有两个陈述,不得不说:
1. m已经在堆栈上分配了一个指向对象的指针
2.对象m本身(因此它携带的数据以及对其方法的访问)已在堆上分配
任何人都可以用C,C++和Java来清楚地解释.什么都在堆栈上,什么都在堆上,什么时候分配完成.
我所知道的,
每个函数调用的基元,指针或引用变量的所有局部变量都在新的堆栈帧上.
用new或malloc创建的任何东西都在堆上.
我对一些事感到困惑.
作为在堆上创建的对象的成员的引用/原语是否也存储在堆上?
那些在每个帧中递归创建的方法的本地成员呢?它们都在堆栈上,如果是,则在运行时分配堆栈内存吗?对于文字,它们是代码段的一部分吗?那么C中的全局变量,C++/Java中的静态和C中的静态.
我刚才有一个关于堆栈变量与堆变量如何工作的快速问题.据我了解,堆栈变量是函数返回后的变量,并且堆变量是持久的.但我真正感到困惑的是如何在函数内部分配堆变量:
int MyObject::addObject(const char* a){
MyObject newObject(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
说我有一个构造函数MyObject是newObject(const char * a).然后在这个函数调用它时,返回之后新构造的newObjectget被删除了吗?如果是,那么如何在函数内分配到堆呢?如果没有,你如何在以后清理你的记忆?
此外,析构函数的作用究竟是什么?何时被称为?
对于那些有课程开发经验的人:关于数组的最佳策略是什么?
我见过一些学校在变量和控制结构之后教授数组,甚至在教学功能之前.这允许教授一些基本的算法等.然而,它带来了如何将数组传递给函数的问题,因此有必要回到数组指针教授和补丁.
另一个选择是从变量和控制结构转到函数,然后教指针,一旦你有指针,从头开始教数组,然后使用它来获得动态内存分配.
对我来说第二个选项更有意义,因为与简单变量不同,使用数组很容易"走出界限",但是尚未了解内存和指针的学生可能无法理解这些界限之外的内容.
但是,我很想知道其他人的想法.
对于以下代码:
foo(int n){
int array[n];
}
Run Code Online (Sandbox Code Playgroud)
我理解这是无效的语法,并且它是无效的,因为c ++标准要求在编译时设置数组大小(尽管一些编译器支持以下语法).
但是我也理解以下是有效的语法:
bar(int n){
int *array = new int[n];
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这是允许的,是不是创建一个在运行时确定大小的数组?这样做是好的做法,还是应该使用向量,如果我需要这样做呢?