cuda 函数指针_c – 在CUDA中编写内核函数的正确方法?

在某些情况下,您可以在GPU上以完全潜在的速度运行程序,而只需很少的移植工作来处理普通的CPU版本,这可能就是其中之一.

如果您有可能拥有这样的功能:

void process_single_video_frame(void* part_of_frame)

{

// initialize variables

...

intermediate_result_1 = function1(part_of_frame);

intermediate_result_2 = function2(intermediate_result_1);

intermediate_result_3 = function3(intermediate_result_2);

store_results(intermediate_result_3);

}

并且您可以同时处理许多part_of_frames.说,几千,

和function1(),function2()和function3()经历了几乎相同的代码路径(也就是说,程序流程并不严重依赖于框架的内容),

那么,本地记忆可能会为你做所有的工作.本地内存是一种存储在全局内存中的内存.它以一种微妙但深刻的方式与全局内存不同……内存只是交错,相邻线程将访问相邻的32位字,如果所有线程都读取,则使内存访问完全合并其本地内存阵列的相同位置.

您的程序流程是您首先将part_of_frame复制到本地数组并准备其他本地数组以获得中间结果.然后,将指针传递给代码中各种函数之间的本地数组.

一些伪代码:

const int size_of_one_frame_part = 1000;

__global__ void my_kernel(int* all_parts_of_frames) {

int i = blockIdx.x * blockDim.x + threadIdx.x;

int my_local_array[size_of_one_frame_part];

memcpy(my_local_array,all_parts_of_frames + i * size_of_one_frame_part);

int local_intermediate_1[100];

function1(local_intermediate_1,my_local_array);

...

}

__device__ void function1(int* dst,int* src) {

...

}

总之,这种方法可以让您使用CPU功能几乎不变,因为并行性不是来自创建函数的并行版本,而是通过并行运行整个函数链.并且通过在本地阵列中交错存储器的硬件​​支持再次实现了这一点.

笔记:

> part_of_frame从全局到本地内存的初始副本未合并,但希望您有足够的计算来隐藏它.>在计算能力<= 1.3的设备上,每个线程只有16KiB的本地内存可用,这对于你的part_of_frame和其他中间数据可能是不够的.但是在计算能力> = 2.0时,这已经扩展到512KiB,这应该是充足的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值