求平均值

有个问题想请教下大家
假如我现在有个很大的数组,里面有的数值有正有负,现在我要求正数的平均值和负数的平均值,应该用什么方法好些呢?
我想过用归约的方法先求正数负数的和,再计算平均值,但是有2个疑问:
1,计算每个数的时候我必须判断该数值是正是负,但是这样频繁的if判断在cuda中会不会很影响速度?
2,在计数的时候所有并行的thread都试图在计数器上读写,会不会也很影响速度?

1.简单的分支可以被编译器自动优化,不用过于担心分支效率问题

2.每个线程各自统计各自的结果
最后再求和

1、如果只是简单的求平均值,CPU计算的速度估计不会比在GPU上的慢
2、你可以先把数据从显存复制到共享内存,每个块独立统计正数和负数的和以及正数和负数的个数

参考归约的最后一个例子的方法
只有块内最后一次统计的时候用shared memory