Zaimplementowałem projekt z opencl. Mam plik, który zawiera funkcję jądra, a funkcje używane przez jądro są zawarte w osobnym pliku nagłówkowym, ale kiedy zmieniam dołączony plik, czasami zmiany są stosowane, a czasami nie są i to powoduje, że jestem zdezorientowany jeśli aplikacja ma błąd lub nie.OpenCL clBuildProgram buforuje źródło i nie rekompiluje, jeśli # include'd zmiany źródła
Sprawdziłem inne posty w stackoverflow i zobacz, jak nvidia ma poważny problem z przekazaniem -I{include directory}
, więc zmieniłem go i wyraźnie podałem adres plików nagłówkowych, ale nadal kompilator opencl nie jest w stanie znaleźć błędów w pliku nagłówkowym, który jest zawarty w nazwie pliku jądra.
Również używam nvidia gtx 980 i mam zainstalowany CUDA 7.0 na moim komputerze.
Ktoś ma takie samo doświadczenie? jak mogę to naprawić?
Więc załóżmy, że mam kernel tak:
#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();
}
których test_kernel_include.cl
jest następujący:
int test_func()
{
return 1;
}
Potem uruchomić kod i uzyskać tablicę której wszyscy członkowie są równa się 1
zgodnie z naszymi oczekiwaniami. Teraz mogę zmienić test_kernel_include.cl
do:
int test_func()
{
return 2;
}
ale wynik jest nadal tablicą której wszyscy członkowie są równe 1
który powinien zmienić się 2
ale one nie są.
Również w oknach można znaleźć '% AppData% \ NVIDIA \ ComputeCache'. Czy ta głupia rzecz dotyczy również AMD i intel, czy też jest specyficzna dla kompilatora nvidia? – mmostajab
Zauważyłem tylko ten problem z NVIDIA. Inni mogą również implementować schematy buforowania, ale być może biorą pod uwagę nagłówki. – jprice
Po prostu dodałem 'del/Q/S% APPDATA% \ NVIDIA \ ComputeCache *' do mojego zdarzenia prebuild w visual studio, teraz jest to zawsze usuwanie pamięci podręcznej kompilatora przed ponownym uruchomieniem aplikacji :) – mmostajab