相关疑难解决方法(0)

在CUDA设备代码中使用std :: vector

问题是:有没有办法在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)

那么有一种方法可以在全局部分使用向量吗?我最近尝试了以下内容:

  1. 创建一个新的Cuda项目
  2. 转到项目的属性
  3. 打开Cuda C/C++
  4. 转到设备
  5. 将"代码生成"中的值更改为此值:compute_20,sm_20

........之后我能够在我的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)

cuda

37
推荐指数
4
解决办法
3万
查看次数

为什么内存会分成堆栈和堆?

可能重复:
堆栈和堆的内容和位置

我在堆栈和堆上有几个问题.

要知道的基本事情是堆栈比堆快,但是有限.(如我错了请纠正我).

但是,我总是想知道堆栈和堆是如何工作的.RAM只是一块内存,它不分为'堆栈'和'堆'(或者是它?).如果是这样,为什么我们首先将堆栈和堆中的内存分开?

操作系统可以让我们能够分配堆栈中的所有内容 - >一切都变得更快 - >幸福的世界?

我很确定事实并非如此.但为什么!?谁能给我一个深入的答案?

很抱歉,如果这篇帖子是某人发过的一些帖子的副本,那么有很多与堆栈和堆相关的帖子,我找不到我所拥有的确切问题.如果您碰巧知道一个,请继续并将其链接.

memory heap stack memory-management

34
推荐指数
2
解决办法
1万
查看次数

程序堆栈和堆,它们如何工作?

我知道每个正在运行的进程都在虚拟内存中有与之关联的页面,其中很少会根据需要加载到主内存中.我也知道程序将有一个堆栈,也有一个堆来分配动态内存.这是我的问题.

  1. 堆栈也是主内存中某些页面的一部分吗?
  2. 当程序进入等待状态时会发生什么?堆栈指针,程序计数器和其他信息存储在哪里?
  3. 为什么堆栈增长和堆增长?
  4. L1,L2缓存是否只包含一个连续内存块,或者它可以包含堆栈和堆的某些部分?

你能推荐一本涵盖这些东西的好书吗?

heap stack kernel

27
推荐指数
2
解决办法
2万
查看次数

C++:我什么时候应该使用结构而不是类,速度差异在哪里?

  • 我什么时候应该使用一个struct而不是一个类?我目前正在使用从OpenGL纹理包装到位图字体的所有类.

  • 我使用的类就像一个struct(没有使用继承,多态等)仍然比一个慢struct

c++ oop struct

22
推荐指数
3
解决办法
8814
查看次数

C++中的指针存储在堆栈中还是堆中?

我试图理解堆栈内存之间的区别,这个问题在SO上以及这个解释做了很好的解释基础知识.

然而,在第二个解释中,我遇到了一个我有一个具体问题的例子,例子如下:

堆分配示例

据说这个对象m是在堆上分配的,我只是想知道这是不是完整的故事.根据我的理解,对象本身确实在堆上分配,因为new关键字已用于其实例化.

但是,指向对象的指针m是不是在堆栈上分配的同一时间?否则,如何访问对象本身,当然它位于堆中.我觉得为了完整起见,本教程中应该提到这一点,留下它会给我带来一些混乱,所以我希望有人能够清楚地告诉我,我对我的理解是对的应该基本上有两个陈述,不得不说:

1. m已经在堆栈上分配了一个指向对象的指针

2.对象m本身(因此它携带的数据以及对其方法的访问)已在堆上分配

c++ pointers memory-management

22
推荐指数
3
解决办法
3万
查看次数

堆与堆栈分配的影响(.NET)

从关于Heap和Stack 的SO回答 1中,它提出了一个问题:为什么知道变量的分配位置很重要?

另一个答案,有人指出堆栈更快.这是唯一的含义吗?有人可以提供一个代码示例,其中简单的分配位置更改可以解决问题(例如,性能)?

请注意,此问题是特定于.NET的

1问题从SO中删除.

.net c# heap performance stack

21
推荐指数
2
解决办法
1万
查看次数

什么存储在堆上以及存储在堆栈中的内容?

任何人都可以用C,C++和Java来清楚地解释.什么都在堆栈上,什么都在堆上,什么时候分配完成.

我所知道的,

每个函数调用的基元,指针或引用变量的所有局部变量都在新的堆栈帧上.

用new或malloc创建的任何东西都在堆上.

我对一些事感到困惑.

作为在堆上创建的对象的成员的引用/原语是否也存储在堆上?

那些在每个帧中递归创建的方法的本地成员呢?它们都在堆栈上,如果是,则在运行时分配堆栈内存吗?对于文字,它们是代码段的一部分吗?那么C中的全局变量,C++/Java中的静态和C中的静态.

c c++ java memory-management

21
推荐指数
2
解决办法
2万
查看次数

Stack vs Heap C++

我刚才有一个关于堆栈变量与堆变量如何工作的快速问题.据我了解,堆栈变量是函数返回后的变量,并且堆变量是持久的.但我真正感到困惑的是如何在函数内部分配堆变量:

int MyObject::addObject(const char* a){
    MyObject newObject(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

说我有一个构造函数MyObjectnewObject(const char * a).然后在这个函数调用它时,返回之后新构造的newObjectget被删除了吗?如果是,那么如何在函数内分配到堆呢?如果没有,你如何在以后清理你的记忆?

此外,析构函数的作用究竟是什么?何时被称为?

c++ memory-management

20
推荐指数
1
解决办法
1万
查看次数

在教C时,在指针之前或之后教导数组会更好吗?

对于那些有课程开发经验的人:关于数组的最佳策略是什么?

我见过一些学校在变量和控制结构之后教授数组,甚至在教学功能之前.这允许教授一些基本的算法等.然而,它带来了如何将数组传递给函数的问题,因此有必要回到数组指针教授和补丁.

另一个选择是从变量和控制结构转到函数,然后教指针,一旦你有指针,从头开始教数组,然后使用它来获得动态内存分配.

对我来说第二个选项更有意义,因为与简单变量不同,使用数组很容易"走出界限",但是尚未了解内存和指针的学生可能无法理解这些界限之外的内容.

但是,我很想知道其他人的想法.

c arrays pointers

19
推荐指数
4
解决办法
2826
查看次数

当int array [n]不是时,为什么new int [n]有效?

对于以下代码:

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)

我不明白为什么这是允许的,是不是创建一个在运行时确定大小的数组?这样做是好的做法,还是应该使用向量,如果我需要这样做呢?

c++ arrays

19
推荐指数
5
解决办法
4169
查看次数

标签 统计

c++ ×5

memory-management ×4

heap ×3

stack ×3

arrays ×2

c ×2

pointers ×2

.net ×1

c# ×1

cuda ×1

java ×1

kernel ×1

memory ×1

oop ×1

performance ×1

struct ×1