Ich bin ein absoluter Anfänger mit OpenCL und ich versuche, den folgenden Kernel zu arbeiten. Wenn ich das Programm starte, erhalte ich einen Fehler im Build-Prozess des Kernel-Programms. Mehr Spezifität der Fehler ist folgender:OpenCL struct Argument ungültiger Adressraum
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,
^
Sie können den Kernel hier sehen. Am Anfang dachte ich, dass es daran lag, dass ich die Strukturen nicht innerhalb des Kernels definiert hatte, aber selbst wenn ich sie hinzufügte, existierte das Problem immer noch. Was mache ich hier falsch?
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;
}
}
Danke. Das war in der Tat das Problem. Ich habe es getestet, bevor ich deine Antwort gesehen habe und kam zurück, um zu kommentieren, dass ich die Lösung gefunden habe. – gkaran89
Ich fand es im Allgemeinen nett (keine Ahnung von diesem Fall), um Fehler von verschiedenen Compilern (AMD, Intel, zum Beispiel) zu sehen; Nicht alle sind in allen Fällen hilfreich. – eudoxos