gpt4 book ai didi

OpenCL 全局内存获取

转载 作者:行者123 更新时间:2023-12-05 00:35:04 25 4
gpt4 key购买 nike

我正在考虑重新设计我的 GPU OpenCL 内核以加快速度。问题是有很多未合并的全局内存,并且提取确实降低了性能。所以我计划将尽可能多的全局内存复制到本地,但我必须选择要复制的内容。

现在我的问题是:对小块内存的多次获取是否比对大块的更少获取造成更大的伤害?

最佳答案

您可以使用 clGetDeviceInfo 找出设备的缓存行大小。 ( clGetDeviceInfo , CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE) 在今天的许多设备上,这个值通常是 16 字节。

小的读取可能会很麻烦,但如果您从同一个缓存行读取,应该没问题。简短的回答:你需要在内存中将你的“小块”放在一起以保持快速。

我在下面有两个函数来演示两种访问内存的方法——vectorAddFoo 和 vectorAddBar。第三个函数 copySomeMemory(...) 特别适用于您的问题。两个向量函数都将它们的工作项添加到要添加的向量的一部分,但使用不同的内存访问模式。 vectorAddFoo 使每个工作项处理一个向量元素块,从其在数组中计算出的位置开始,并在其工作负载中向前移动。 vectorAddBar 的工作项从它们的 gid 开始,并在获取和添加下一个元素之前跳过 gSize(= 全局大小)元素。

vectorAddBar 将执行得更快,因为读取和写入落入内存中的同一缓存行。每 4 次浮点读取将落在同一个缓存行上,并且只从内存 Controller 执行一项操作。在这件事中读取 a[] 和 b[] 后,所有四个工作项都将能够进行添加,并将它们的写入排队到 c[]。

vectorAddFoo 将保证读取和写入不在同一个缓存行中(除了非常短的向量 ~totalElements<5)。对工作项的每次读取都需要来自内存 Controller 的操作。除非 gpu 在每种情况下都缓存以下 3 个浮点数,否则这将导致 4 倍的内存访问。

__kernel void  
vectorAddFoo(__global const float * a,
__global const float * b,
__global float * c,
__global const totalElements)
{
int gid = get_global_id(0);
int elementsPerWorkItem = totalElements/get_global_size(0);
int start = elementsPerWorkItem * gid;

for(int i=0;i<elementsPerWorkItem;i++){
c[start+i] = a[start+i] + b[start+i];
}
}
__kernel void
vectorAddBar(__global const float * a,
__global const float * b,
__global float * c,
__global const totalElements)
{
int gid = get_global_id(0);
int gSize = get_global_size(0);

for(int i=gid;i<totalElements;i+=gSize){
c[i] = a[i] + b[i];
}
}
__kernel void
copySomeMemory(__global const int * src,
__global const count,
__global const position)
{
//copy 16kb of integers to local memory, starting at 'position'
int start = position + get_local_id(0);
int lSize = get_local_size(0);
__local dst[4096];
for(int i=0;i<4096;i+=lSize ){
dst[start+i] = src[start+i];
}
barrier(CLK_GLOBAL_MEM_FENCE);
//use dst here...
}

关于OpenCL 全局内存获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9912385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com