gpt4 book ai didi

c++ - OpenCL 结构值在 CPU 上正确但在 GPU 上不正确

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:51 24 4
gpt4 key购买 nike

我在主机代码和内核包含的文件中确实有一个结构

typedef struct {
float x, y, z,
dir_x, dir_y, dir_z;
int radius;
} WorklistStruct;

我在我的 C++ 主机代码中构建这个结构,并通过缓冲区将它传递给 OpenCL 内核。

如果我选择一个 CPU 设备进行计算,我将得到以下结果:

 printf ( "item:[%f,%f,%f][%f,%f,%f]%d,%d\n", item.x, item.y, item.z, item.dir_x, item.dir_y,
item.dir_z , item.radius ,sizeof(float));

主持人:

item:[20.169043,7.000000,34.933712][0.000000,-3.000000,0.000000]1,4

设备(CPU):

item:[20.169043,7.000000,34.933712][0.000000,-3.000000,0.000000]1,4

如果我选择 GPU 设备 (AMD) 进行计算,就会发生奇怪的事情:

主持人:

item:[58.406261,57.786015,58.137501][2.000000,2.000000,2.000000]2,4

设备(GPU):

item:[58.406261,2.000000,0.000000][0.000000,0.000000,0.000000]0,0

值得注意的是 sizeof(float) 在 gpu 上是垃圾。

我假设 float 在不同设备上的布局存在问题。

注意:该结构包含在这种类型的结构数组中,并且此数组中的每个结构在 GPU 上都是垃圾

有人知道为什么会这样,我如何预测?

编辑我在 and 处添加了一个 %d 并将其替换为 1,结果是:1065353216

编辑:这是我正在使用的两个结构

typedef struct {
float x, y, z,//base coordinates
dir_x, dir_y, dir_z;//directio
int radius;//radius
} WorklistStruct;

typedef struct {
float base_x, base_y, base_z; //base point
float radius;//radius
float dir_x, dir_y, dir_z; //initial direction
} ReturnStruct;

我测试了一些其他的东西,看起来像是 printf 的问题。这些值(value)观似乎是正确的。我将参数传递给返回结构,读取它们并且这些值是正确的。

我不想发布所有相关代码,这将是几百行。如果没有人知道我会压缩一点。

啊,为了打印,我正在使用 #pragma OPENCL EXTENSION cl_amd_printf : enable

编辑:看起来真的像是 printf 的问题。我根本不再使用它了。

最佳答案

有一个简单的方法可以检查发生了什么:

1 - 创建主机端数据并初始化它:

int num_points = 128;

std::vector<WorklistStruct> works(num_points);
std::vector<ReturnStruct> returns(num_points);

for(WorklistStruct &work : works){
work = InitializeItSomehow();
std::cout << work.x << " " << work.y << " " << work.z << std::endl;
std::cout << work.radius << std::endl;
}

// Same stuff with returns
...

2 - 使用 COPY_HOST_PTR 标志创 build 备端缓冲区,映射它并检查数据一致性:

cl::Buffer dev_works(..., COPY_HOST_PTR, (void*)&works[0]);
cl::Buffer dev_rets(..., COPY_HOST_PTR, (void*)&returns[0]);

// Then map it to check data
WorklistStruct *mapped_works = dev_works.Map(...);
ReturnStruct *mapped_rets = dev_rets.Map(...);

// Output values & unmap buffers
...

3 - 像以前一样检查设备端的数据一致性。

另外,确保内核和主机端代码都包含的代码(大概是头文件)是纯 OpenCL C(AMD 编译器有时可以“吞下”一些错误)并且您已经导入了包含的目录搜索,构建 OpenCL 内核时(clBuildProgramm 阶段的“-I”标志)

已编辑:在每一步,请收集返回码(或捕获异常)。除此之外,clBuildProgramm 阶段的“-Werror”标志也很有用。

关于c++ - OpenCL 结构值在 CPU 上正确但在 GPU 上不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24450831/

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