CUDA 两个向量相加: 当数组的元素个数大于所开的线程数量的时候的解决办法
2015-03-11 13:55
941 查看
当我们对两个向量 a
和b
相加, 结果保存到C
数组处。 传统的C代码如下:
试想, 如果假如我们的系统是multiCPUs 或者多个CPU核的时候, 具体的, 我们假设我们有两个核。 现在我们想利用好这个资源, 对其进行向量的相加。 此时我们需要写一个并行的程序。 我们可以让一个核执行数组偶数索引的相加, 从tid = 0 开始, 另一个核对数组奇数索引相加, 从tid = 1开始。 那么我们可能有如下两份代码:
CPU core 1执行:
正常情况下, 我们开的线程数都是大于数组的大小的数目的, GPU程序如下:
由于一个GPU所能启动的线程数目是一定的。 所以加入我们的数组数目远远大于我们启动的线程的数目, 我们需要执行更改GPU的代码。 如下:
tid += blockDim.x * gridDim.x , 其中blockDim.x * gridDim.x就是我们开的线程的总的数目。 这种情况下, 一般是我们开的线程数目小于数组中元素的个数N. 注意, 一个线程只能做一个数组元素的相加。 一旦线程0 完成了对 a[0]和b[0]的相加, 我们不想让他闲下来, 而是让让这个线程去做0 + blockDim.x * gridDim.x 的相加。 一次类推, 线程1 。。。, 直至这N个元素全部相加完成。
不难看出, tid + 开的总的线程数 能够解决开的线程数目小于work数目的难题。 那就是前面的线程在做完自己的work后, 去做其他的work了。
和b
相加, 结果保存到C
数组处。 传统的C代码如下:
void add(int *a, int *b, int *c) { int tid = 0; // this is CPU 0, so we start at zero while(tid < N) { c[tid] = a[tid] + b[tid]; tid++; } }上述代码是在CPU上执行。 当然, 只有一个CPU, 这个CPU一次只能错做数组的一个下标的值相加。
试想, 如果假如我们的系统是multiCPUs 或者多个CPU核的时候, 具体的, 我们假设我们有两个核。 现在我们想利用好这个资源, 对其进行向量的相加。 此时我们需要写一个并行的程序。 我们可以让一个核执行数组偶数索引的相加, 从tid = 0 开始, 另一个核对数组奇数索引相加, 从tid = 1开始。 那么我们可能有如下两份代码:
CPU core 1执行:
void add(int *a, int *b, int *c) { int tid = 0; // this is CPU 0, so we start at zero while(tid < N) { c[tid] = a[tid] + b[tid]; tid += 2; } }CPU core 2 执行:
void add(int *a, int *b, int *c) { int tid = 1; // this is CPU 0, so we start at zero while(tid < N) { c[tid] = a[tid] + b[tid]; tid += 2; } }
正常情况下, 我们开的线程数都是大于数组的大小的数目的, GPU程序如下:
__global__ void add(int *dev_a, int *dev_b, int *dev_c) { int tid = blockIdx.x; // handle the data at this index if(tid < N) { c[tid] = a[tid] + b[tid]; } }
由于一个GPU所能启动的线程数目是一定的。 所以加入我们的数组数目远远大于我们启动的线程的数目, 我们需要执行更改GPU的代码。 如下:
__global__ void add(int *dev_a, int *dev_b, int *dev_c) { int tid = blockIdx.x; // handle the data at this index if(tid < N) { c[tid] = a[tid] + b[tid]; tid += blockDim.x * gridDim.x; } }分析:
tid += blockDim.x * gridDim.x , 其中blockDim.x * gridDim.x就是我们开的线程的总的数目。 这种情况下, 一般是我们开的线程数目小于数组中元素的个数N. 注意, 一个线程只能做一个数组元素的相加。 一旦线程0 完成了对 a[0]和b[0]的相加, 我们不想让他闲下来, 而是让让这个线程去做0 + blockDim.x * gridDim.x 的相加。 一次类推, 线程1 。。。, 直至这N个元素全部相加完成。
不难看出, tid + 开的总的线程数 能够解决开的线程数目小于work数目的难题。 那就是前面的线程在做完自己的work后, 去做其他的work了。
相关文章推荐
- 线程解决:一个长度的30000的int数组,其中放随机数,利用多核的优势,求数组中元素的和
- java实现 数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- android的AsyncTask超出最大线程数量时报错解决办法
- Java 找到数组中两个元素相加等于指定数的所有组合
- LeetCode 1. Two Sum--数组中两元素相加为该数值,输出对应的两个索引
- 【算法王道】找到数组中两个元素相加等于指定数
- 第一个cuda程序-基于VS2010+CUDA5.0 两个向量相加的GPU实现
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- Catia打不开大于两个G内存的文件的解决办法(如图)
- cuda编程入门示例1---两个向量对应元素相乘
- java 无序数组中两个元素相加等于指定的数 o(n)
- 两个数组逆排元素对应相加,返回一个数组
- 大功率无线网卡两个的时候出现干扰的解决办法
- html两个元素中间的空白解决办法
- 编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。
- python2.7下不能正常输出中文数组某个元素的解决办法
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 找到一个数组中相加为特定数值的两个元素
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。