openCL-处理数组和标量的差异
我正试图深入研究openCL。现在我在问自己,为什么标量和数组在传输到GPU时有所不同 下面是两个输入。一个标量和一个数组。为什么在将它们传输到GPU时会有如此大的差异 提前谢谢openCL-处理数组和标量的差异,opencl,Opencl,我正试图深入研究openCL。现在我在问自己,为什么标量和数组在传输到GPU时有所不同 下面是两个输入。一个标量和一个数组。为什么在将它们传输到GPU时会有如此大的差异 提前谢谢 // input size int input_size = 4; err = clSetKernelArg(kernel, 0, sizeof(unsigned int), &_input_size); if (err != CL_SUCCESS) { throw std::runtime_error("
// input size
int input_size = 4;
err = clSetKernelArg(kernel, 0, sizeof(unsigned int), &_input_size);
if (err != CL_SUCCESS) {
throw std::runtime_error("Failed to set kernel arguments!");
}
// input
int input[input_size];
input[0] = 1;
input[1] = 2;
input[2] = 3;
input[3] = 4;
cl_mem cl_input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(int) * _input_size, NULL, NULL);
if (!cl_input) {
throw std::runtime_error("Failed to allocate device memory!");
}
err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &cl_input);
if (err != CL_SUCCESS) {
throw std::runtime_error("Failed to set kernel arguments!");
}
err = clEnqueueWriteBuffer(commands, cl_input, CL_TRUE, 0, sizeof(int) * _input_size, _input, 0, NULL, NULL);
if (err != CL_SUCCESS) {
throw std::runtime_error("Failed to write to source array!");
}
// output
int output_size = 4;
int output[output_size];
cl_mem cl_output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(int) * _output_size, NULL, NULL);
if (!cl_output) {
throw std::runtime_error("Failed to allocate device memory!");
}
err = clSetKernelArg(kernel, 2, sizeof(cl_mem), &cl_output);
if (err != CL_SUCCESS) {
throw std::runtime_error("Failed to set kernel arguments!" );
}
在OpenCL中,标量是按值传递的,是每个线程的常量。数组通过引用(地址)传递,可用于输入(只读)、输出(只读)或输入/输出(读/写)。数组要求将cl_mem对象作为参数传递。cl_mem是一个描述数组的元对象。标量非常简单,它们只需要元数据的大小 因此,在上面的示例中,内核应该是
kernel void mykernel( const int arg0, global int * arg1, global int * arg2 ... ) {
int i = get_global_id(0);
// In every thread arg0 is constant value and cannot be changed
if (i < arg0)
arg2[i] = arg[1[i];
}
kernel void mykernel(常量int arg0、全局int*arg1、全局int*arg2…){
int i=获取全局id(0);
//在每个线程中,arg0都是常量,不能更改
if(i 我还不确定,但我很确定这是因为数组不是标量。在严肃的注释中,我完全没有线索。你要问的是什么。我想写一些C++模板插入函数来处理背景中的OPE/OPEN输出。如果一个数组需要比标量的其他处理,我的模板函数思想是不可实现的。