caffe源代码分析--math_functions.cu代码研究
2014-10-29 19:50
906 查看
当中用到一个宏定义CUDA_KERNEL_LOOP
在common.hpp中有。
#defineCUDA_KERNEL_LOOP(i,n)
\
for(inti
= blockIdx.x * blockDim.x + threadIdx.x; \
i < (n); \
i +=blockDim.x * gridDim.x)
先看看caffe採取的线程格和线程块的维数设计,
还是从common.hpp能够看到
CAFFE_CUDA_NUM_THREADS
CAFFE_GET_BLOCKS(constintN)
明显都是一维的。
整理一下CUDA_KERNEL_LOOP格式看看,
for(inti
= blockIdx.x * blockDim.x + threadIdx.x;
i< (n);
i+= blockDim.x * gridDim.x)
blockDim.x* gridDim.x表示的是该线程格全部线程的数量。
n表示核函数总共要处理的元素个数。
有时候,n会大于blockDim.x*
gridDim.x,因此并不能一个线程处理一个元素。
由此通过上面的方法,让一个线程串行(for循环)处理几个元素。
这事实上是经常使用的伎俩,得借鉴学习一下。
再来看一下这个核函数的实现。
template<typename Dtype>
__global__void mul_kernel(const int n, const Dtype* a,
constDtype* b, Dtype* y)
{
CUDA_KERNEL_LOOP(index,n)
{
y[index]= a[index] * b[index];
}
}
明显就是算两个向量的点积了。
因为向量的维数可能大于该kernel函数线程格的总线程数量。
因此有些线程能够要串行处理几个元素。
在common.hpp中有。
#defineCUDA_KERNEL_LOOP(i,n)
\
for(inti
= blockIdx.x * blockDim.x + threadIdx.x; \
i < (n); \
i +=blockDim.x * gridDim.x)
先看看caffe採取的线程格和线程块的维数设计,
还是从common.hpp能够看到
CAFFE_CUDA_NUM_THREADS
CAFFE_GET_BLOCKS(constintN)
明显都是一维的。
整理一下CUDA_KERNEL_LOOP格式看看,
for(inti
= blockIdx.x * blockDim.x + threadIdx.x;
i< (n);
i+= blockDim.x * gridDim.x)
blockDim.x* gridDim.x表示的是该线程格全部线程的数量。
n表示核函数总共要处理的元素个数。
有时候,n会大于blockDim.x*
gridDim.x,因此并不能一个线程处理一个元素。
由此通过上面的方法,让一个线程串行(for循环)处理几个元素。
这事实上是经常使用的伎俩,得借鉴学习一下。
再来看一下这个核函数的实现。
template<typename Dtype>
__global__void mul_kernel(const int n, const Dtype* a,
constDtype* b, Dtype* y)
{
CUDA_KERNEL_LOOP(index,n)
{
y[index]= a[index] * b[index];
}
}
明显就是算两个向量的点积了。
因为向量的维数可能大于该kernel函数线程格的总线程数量。
因此有些线程能够要串行处理几个元素。
相关文章推荐
- caffe源代码分析--Blob类代码研究
- kfs代码研究(六、ChunkManager分析)
- 安全专家浅谈恶意代码的研究分析(2)
- thrift源码研究-TJSONProtocol代码分析
- Scrapy研究探索(三)——Scrapy核心架构与代码运行分析
- caffe源码分析--Blob类代码研究
- 开源代码分析研究 之 Terminals
- caffe源码分析--SyncedMemory类代码研究
- <一>--RIL层代码分析-RIL_RadioFunctions *RIL_Init(funcs =rilInit()->mainloop()
- kfs代码研究(六、ChunkManager分析)
- caffe make的时候出错:src/caffe/util/math_functions.cu(140): error: calling a host function("std::signbit
- 安全专家浅谈恶意代码的研究分析(3)
- kfs代码研究(四、LayoutManager分析)
- 浅谈恶意代码的研究分析
- thift源码研究-客户端代码分析
- 安全专家浅谈恶意代码的研究分析(1)
- 安全专家浅谈恶意代码的研究分析(4)
- C#特性Attribute的“.NET研究”实际应用之:代码统计分析
- 转载_Linux内核延时研究与函数代码分析
- Nutch1.7源码再研究之---11 Fetch中的QueueFeeder线程代码分析