Jestem całkowicie początkującym użytkownikiem OpenCL i staram się, aby to jądro działało. Po uruchomieniu programu pojawia się błąd w procesie kompilacji programu jądra. Bardziej szczegółowy błąd to:Argument openCL struktury struct niepoprawna przestrzeń adresowa
Error: Failed to build program executable!
<program source>:19:64: error: invalid address space for argument to __kernel function
__kernel void accelarate_flow(__global const t_param params,
^
Tutaj można zobaczyć jądro. Na początku myślałem, że to dlatego, że nie miałem zdefiniowanych struktur wewnątrz jądra, ale nawet kiedy je dodałem, problem nadal istnieje. Co ja tu robię źle?
const char *accelerate_flow_kernel_source =
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
typedef struct
{
int nx;
int ny;
int maxIters;
int reynolds_dim;
double density;
double accel;
double omega;
} t_param;
typedef struct
{
double speeds[9];
} t_speed;
__kernel void accelarate_flow(__global const t_param params,
__global const int* obstacles,
__global t_speed* cells,
const unsigned int count)
{
int pos = get_global_id(0);
if(pos >= count || pos % params.nx != 0) return;
double w1,w2;
w1 = params.density * params.accel/9.0;
w2 = params.density * params.accel/36.0;
if(!obstacles[pos] &&
(cells[pos].speeds[3] - w1) > 0.0 &&
(cells[pos].speeds[6] - w2) > 0.0 &&
(cells[pos].speeds[7] - w2) > 0.0)
{
cells[pos].speeds[1] += w1;
cells[pos].speeds[5] += w2;
cells[pos].speeds[8] += w2;
cells[pos].speeds[3] -= w1;
cells[pos].speeds[6] -= w2;
cells[pos].speeds[7] -= w2;
}
}
Dzięki. To był rzeczywiście problem. Testowałem to, zanim zobaczyłem twoją odpowiedź i wróciłem do komentarza, że znalazłem rozwiązanie. – gkaran89
Znalazłem to fajnie w ogóle (nie ma pojęcia o tym przypadku), aby zobaczyć błędy z różnych kompilatorów (na przykład AMD, Intel); nie wszystkie z nich są pomocne we wszystkich przypadkach. – eudoxos