阵列推力动态内存分配
thrust dynamic memory allocation for array
我有一个由推力使用的函子,我需要动态指定它的长度,就像一样
struct func {
const int h;
func(const int _h): h(_h) {}
__device__ __host__
void operator()(int id) {
double data[h];
}
};
我不知道该怎么做,因为h必须是一个已知的数字,但直到运行时才知道。
解决这个问题的明显方法是使用动态内存分配,因此函子变成
__device__ __host__
void operator()(int id) {
double *data = new double[h];
// functor code goes here
// Heap memory has context scope, so delete is necessary to stop leaks
delete[] data;
};
这将适用于计算能力为2.0或更新的GPU。不利的一面是,内存分配将在全局内存的运行时堆上,这限制了编译器的优化,而且新的/自由的运算符本身非常慢,因此在内核启动中的每个线程都会发生这种情况,这将耗费大量性能。
另一种选择是,如果h
的值范围有限,可以考虑用模板参数替换运算符代码中的h,然后在已知情况下只使用选择器,因此类似
template<int j>
__device__ __host__
void guts(int id) {
double data[j];
// code here
};
__device__ __host__
void guts_rt(int id) {
double *data = new double[h];
// code here
delete[] data;
};
__device__ __host__
void operator()(int id) {
switch (h) {
case 2:
guts<2>(id);
break;
case 4:
guts<4>(id);
break;
// As many as needed here
default:
guts_rt(id);
break;
}
}
即。尽可能尝试使用硬编码数组(编译器可以对此进行优化),否则就回到动态解决方案(如果你的GPU实际上支持堆内存的动态分配)。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配