基本的に、これらのグローバル変数を使用して割り当て用の OpenCL プログラムをずさんにコーディングしました。
int devType = CL_DEVICE_TYPE_GPU;
cl_int err; /* Error code returned from api calls. */
size_t global; /* Global domain size for our calculation. */
size_t local; /* Local domain size for our calculation. */
cl_platform_id cpPlatform; /* openCL platform. */
cl_device_id device_id; /* Compute device id. */
cl_context context; /* Compute context. */
cl_command_queue commands; /* Compute command queue. */
cl_program program; /* Compute program. */
cl_kernel kernel; /* Compute kernel. */
/* Create data for the run. */
float *data = NULL; /* Original data set given to device. */
float *results = NULL; /* Results returned from device. */
unsigned int correct; /* Number of correct results returned. */
cl_mem input; /* Device memory used for the input array. */
cl_mem output; /* Device memory used for the output SUM. */
int rc = EXIT_FAILURE;
現在、プログラムを整理するために、それらをすべてローカルにしようとしています。
上記の変数から main() 関数に移動するだけで、グローバル変数 N を変換しました。次に、N を使用するすべての関数ヘッダーを更新して、パラメーターとして 'int N' を持ち、N を引数として必要とするすべての関数呼び出しに N を渡しました。プログラムは期待どおりに機能しました。
ですから、私が求めているのは、これらの変数の残りについては、それほど単純でしょうか? 参照と値による受け渡しの概念を理解しており、一部の関数が変数を変更する可能性があることを理解しているため、ポインター参照/逆参照を使用する必要があります。私の懸念は、私のポインター理論が少し大まかで、問題が発生するのではないかと心配していることです。また、定義した関数がこれらの cl 変数をすべて使用できるかどうかもわかりません。
また、関数内で同じ変数名を使用することに問題はありますか?
編集:
恐れていたとおり、device_id をローカライズしようとすると、次の関数で問題が発生します。
void deviceSetup(int devType) {
cl_platform_id cpPlatform; /* openCL platform. */
/* Connect to a compute device. */
if (CL_SUCCESS != clGetPlatformIDs (1, &cpPlatform, NULL))
die ("Error: Failed to find a platform!");
/* Get a device of the appropriate type. */
if (CL_SUCCESS != clGetDeviceIDs (cpPlatform, devType, 1, &device_id, NULL))
die ("Error: Failed to create a device group!");
}
/* Create a compute context. */
void createContext(cl_int err){
context = clCreateContext (0, 1, &device_id, NULL, NULL, &err);
if (!context || err != CL_SUCCESS)
die ("Error: Failed to create a compute context!");
}
/* Create a command commands. */
void createCommandQueue(cl_int err) {
commands = clCreateCommandQueue (context, device_id, 0, &err);
if (!commands || err != CL_SUCCESS)
die ("Error: Failed to create a command commands!");
}
void createAndCompile(cl_int err){
/* Create the compute program from the source buffer. */
program = clCreateProgramWithSource (context, 1,
(const char **) &KernelSource,
NULL, &err);
if (!program || err != CL_SUCCESS)
die ("Error: Failed to create compute program!");
/* Build the program executable. */
err = clBuildProgram (program, 0, NULL, NULL, NULL, NULL);
if (err != CL_SUCCESS)
{
size_t len;
char buffer[2048];
clGetProgramBuildInfo (program, device_id, CL_PROGRAM_BUILD_LOG,
sizeof (buffer), buffer, &len);
die ("Error: Failed to build program executable!\n%s", buffer);
}
}