gpt4 book ai didi

c++ - 推力数组的动态内存分配

转载 作者:行者123 更新时间:2023-11-28 03:02:11 24 4
gpt4 key购买 nike

我有一个推力使用的仿函数,我需要动态指定它的长度,比如

struct func { 

const int h;

func(const int _h): h(_h) {}

__device__ __host__
void operator()(int id) {
double data[h];
}
};

我不确定该怎么做,因为 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。缺点是内存分配将在全局 memoey 中的运行时堆上,这限制了编译器的优化,并且 new/free 运算符本身非常慢,因此在内核启动中为每个线程发生这种情况将消耗大量性能。

另一种方法是,如果 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 实际上支持堆内存的动态分配)。

关于c++ - 推力数组的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com