gpt4 book ai didi

c++ - 减少 OCL 代码中的间接访问

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:06 25 4
gpt4 key购买 nike

我的内核中有以下(伪)代码片段:

kernel void krnl(global X* restrict x){ 
for(int i = 0; i < 100; i++){
x[a].y[b].z[i] * x[a].y[i].n;
}
}

我使用的是 Xilinx FPGA 设备,所以有些东西可能有点不同。该代码适用于 GPU/CPU,但不适用于 FPGA。如果对任何人有帮助,请提供一些详细信息。

x、y、z 和 n 如下:

typedef struct Y
{
float n;
float z[MAXSIZE]
} Y;

typedef struct X
{
int i;
Y y[MAXSIZE];
} X;

'a' 和 'b' 只是 int 的 vector 。

我需要减少间接寻址的数量,理想情况下只更改内核(或添加内联函数 - 我试过了,但数据似乎没有传递给内核)。

具体来说,我需要这样的代码:

for(int i = 0; i < 100; i++){
V.z[i] * K[i].n;
}

最佳答案

好吧,如果 ab 在循环中是静态的,那么做:

kernel void krnl(global X* restrict x){ 
const float* fast_l = x[a].y[b].z;
const Y* fast_r = x[a].y;
for(int i = 0; i < 100; i++){
fast_l[i] * fast_r[i].n;
}
}

编译器不缓存全局读取和写入是很典型的,因为全局数据被认为是高度易变的(由所有工作项访问)。手动缓存通常有助于解决这些问题。

然而,聪明的编译器应该能够猜出所有间接寻址只是一个简单的指针偏移量。我不认为你会在那种情况下有任何收获。示例:

kernel void krnl(global X* restrict x){ 
const float* off_l = ((float *)x)+sizeof(X)*a+sizeof(Y)*b+sizeof(int);
const float* off_r = ((float *)x)+sizeof(X)*a;
for(int i = 0; i < 100; i++){
*(off_l+i) * *(off_r+sizeof(Y)*i);
}
}

关于c++ - 减少 OCL 代码中的间接访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37964645/

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