gpt4 book ai didi

OpenCL clBuildProgram缓存源,并且如果#include的源发生更改,则不会重新编译

转载 作者:行者123 更新时间:2023-12-03 10:49:38 24 4
gpt4 key购买 nike

我已经用opencl实现了一个项目。我有一个包含内核功能的文件,内核使用的功能包含在单独的头文件中,但是当我更改其中包含的文件时,有时会应用更改,有时却没有应用,这使我感到困惑应用程序是否有错误。

我检查了stackoverflow中的其他帖子,并发现nvidia在传递-I{include directory}时存在严重问题,因此我对其进行了更改,并明确给了头文件地址,但是opencl编译器仍然无法在头文件中找到错误,该文件包含在内核文件名。

另外,我正在使用nvidia gtx 980,并且在计算机上安装了CUDA 7.0。

任何人都有相同的经历吗?我该如何解决?

因此,假设我有一个像这样的内核:

#include "../../src/cl/test_kernel_include.cl"

void __kernel test_kernel(
__global int* result,
int n
)
{
int thread_idx = get_global_id(0);
result[thread_idx] = test_func();
}
test_kernel_include.cl如下:
int test_func()
{
return 1;
}

然后,我运行代码,并得到一个数组,该数组的所有成员都等于我们期望的 1。现在,我将 test_kernel_include.cl更改为:
int test_func()
{
return 2;
}

但是结果仍然是一个数组,其中所有成员都等于 1,应更改为 2,但不是。

最佳答案

为了缩短内核编译时间,NVIDIA实现了一种缓存方案,将已编译的内核二进制文件存储到磁盘中,并在下次编译同一内核时加载。在内核源代码上计算出一些哈希值,然后将这些哈希值用作已编译内核缓存的索引。

不幸的是,这些散列不包括主内核源所包含的任何头文件。这意味着,当您更改包含的头文件中的某些内容时,驱动程序实际上将忽略此更改并从磁盘重新加载以前的内核二进制文件(除非主内核源中也进行了更改)。

在Linux系统上,可以在~/.nv/ComputeCache中找到内核缓存。如果在更改其中一个包含文件后删除此目录,则它应强制驱动程序实际重新编译OpenCL内核。

关于OpenCL clBuildProgram缓存源,并且如果#include的源发生更改,则不会重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31338520/

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