__global__ 函数中的动态内存分配

发布于 2024-12-05 09:47:48 字数 195 浏览 1 评论 0原文

我有一张 CC 1.1 卡,我的程序需要我在全局设备函数中动态分配数组。

将为每个执行线程创建这些数组。

malloc 抛出错误,网上冲浪告诉我,对于小于 2.0 的 CC,使用 malloc 是非法的。

我想问一下有什么解决办法吗?

谢谢

I have a CC 1.1 card and my program entails me to dynamically allocate arrays in global or device functions.

These arrays will be created for every thread for execution.

malloc throws up an error and surfing the web tells me that using malloc is illegal for CC less than 2.0.

I wanna ask is there any workaround to it?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一江春梦 2024-12-12 09:47:48

我建议您使用固定大小的内存:

__global__ my_kernel(...) {

__shared__ float memory[BLOCK_SIZE];

};

GPU 上的动态分配很少需要,并且很可能会引入一些性能瓶颈。特别是对于计算能力 1.1,您将需要调整对齐方式
共享内存以获得最佳性能并避免 Warp 内内存争用。

I would suggest you to use fixed size memory:

__global__ my_kernel(...) {

__shared__ float memory[BLOCK_SIZE];

};

dynamic allocation on the GPU is rarely need and can introduce most likely some performance bottleneck. And specially with a compute capability 1.1 you will need to tweak the alignments
of the shared memory to have the best performances and avoid intra-Warp memory contention.

再浓的妆也掩不了殇 2024-12-12 09:47:48

对于 CC1.1 设备,唯一的解决方法是使用 cudaMalloc 从主机分配足够的全局内存,然后在线程之间分配它。

在大多数情况下,只需从主机预分配内存就可以很好地工作,而且我从未遇到过必须使用内核 malloc 的任务(尽管有时这样的想法似乎不错,很快就发现破坏与旧设备的兼容性并不是一件好事,而且我对其性能有所怀疑,但我从未运行过任何基准测试。

For CC1.1 devices the only workaround is to allocate enough global memory from host with cudaMalloc and then divide it between threads.

In most cases just pre-allocating memory from host works pretty well and I've never encountered a task where one had to use kernel malloc (though sometimes such idea seemed good, it quickly turned out that it was not that good to break compatibility with older devices. Also I have suspicions regarding its performance, but I've never run any benchmarks).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文