OpenCL clBuildProgram缓存源,如果#include'd源更改,则不会重新编译

mmo*_*jab 8 opencl

我用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();
}
Run Code Online (Sandbox Code Playgroud)

其中test_kernel_include.cl如下:

int test_func()
{
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

然后我运行代码,我得到一个所有成员都等于1我们期望的数组.现在,我test_kernel_include.cl改为:

int test_func()
{
  return 2;
}
Run Code Online (Sandbox Code Playgroud)

但结果仍然是一个数组,所有成员都1应该更改为哪个2但不是.

Dar*_*ros 12

在平台初始化之前这样做:

setenv("CUDA_CACHE_DISABLE", "1", 1);
Run Code Online (Sandbox Code Playgroud)

它将禁用构建的缓存机制.它也适用于OpenCL平台,尽管它说的是CUDA.

  • @mmostajab Windows等价物是`_putenv_s("CUDA_CACHE_DISABLE","1");` (2认同)

jpr*_*ice 9

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

不幸的是,这些哈希不包括主内核源包含的任何头文件.这意味着当您更改包含的头文件中的内容时,驱动程序将基本上忽略更改并从磁盘重新加载以前的内核二进制文件(除非主内核源代码中的内容也发生了更改).

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