#include <iostream>
#define CL_TARGET_OPENCL_VERSION 220
#include <CL/cl.h>
int main(int argc, char* argv[])
{
cl_platform_id platform;
clGetPlatformIDs(1, &platform, nullptr);
cl_device_id devices[2];
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &devices[0], nullptr);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &devices[1], nullptr);
auto context = clCreateContext(nullptr, 2, devices, nullptr, nullptr, nullptr);
auto pipe = clCreatePipe(context, 0, sizeof(float), 256, nullptr, nullptr);
}
Looks like normal code but segfaults.
Did you make sure your platform & device support pipes before calling that API? Maybe it’s an OpenCL 1.2 device, which doesn’t support pipes.
#include <iostream>
#define CL_TARGET_OPENCL_VERSION 220
#include <CL/cl.h>
int main(int argc, char* argv[])
{
cl_platform_id platform;
clGetPlatformIDs(1, &platform, nullptr);
cl_device_id devices[2];
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &devices[0], nullptr);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &devices[1], nullptr);
auto context = clCreateContext(nullptr, 2, devices, nullptr, nullptr, nullptr);
char version[0xff];
clGetDeviceInfo(devices[0], CL_DEVICE_VERSION, sizeof(version), version, nullptr);
std::cout << version << std::endl;
clGetDeviceInfo(devices[1], CL_DEVICE_VERSION, sizeof(version), version, nullptr);
std::cout << version << std::endl;
auto pipe = clCreatePipe(context, 0, sizeof(float), 256, nullptr, nullptr);
}
OpenCL 2.1 NEO
OpenCL 2.1 (Build 716)
Segmentation fault
Btw, clCreatePipe for a context with one device is ok.
Interesting. My laptop has 3 platforms.
Platform count = 3
++++++++++++++++++platform+++++++++++++++++++
PLATFORM_NAME = Intel(R) OpenCL
PLATFORM_PROFILE = FULL_PROFILE
PLATFORM_VERSION = OpenCL 2.1
PLATFORM_VENDOR = Intel(R) Corporation
PLATFORM_EXTENSIONS = cl_intel_dx9_media_sharing cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_d3d11_sharing cl_khr_depth_images cl_khr_dx9_media_sharing cl_khr_fp64 cl_khr_gl_sharing cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_icd cl_khr_image2d_from_buffer cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_spir
Device count = 2
=============device=============
DEVICE TYPE = CL_DEVICE_TYPE_GPU
MAX_GROUP_SIZE = 256
LOCAL_MEM_SIZE = 65536
MAX_COMPUTE_UNITS = 24
MAX_WORK_ITEM_DIMENSIONS = 3
dim[0] = 256 dim[1] = 256 dim[2] = 256
=============device=============
DEVICE TYPE = CL_DEVICE_TYPE_CPU
MAX_GROUP_SIZE = 8192
LOCAL_MEM_SIZE = 32768
MAX_COMPUTE_UNITS = 8
MAX_WORK_ITEM_DIMENSIONS = 3
dim[0] = 8192 dim[1] = 8192 dim[2] = 8192
++++++++++++++++++platform+++++++++++++++++++
PLATFORM_NAME = Intel(R) OpenCL
PLATFORM_PROFILE = FULL_PROFILE
PLATFORM_VERSION = OpenCL 2.1
PLATFORM_VENDOR = Intel(R) Corporation
PLATFORM_EXTENSIONS = cl_intel_dx9_media_sharing cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_d3d11_sharing cl_khr_depth_images cl_khr_dx9_media_sharing cl_khr_fp64 cl_khr_gl_sharing cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_icd cl_khr_image2d_from_buffer cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_spir
Device count = 2
=============device=============
DEVICE TYPE = CL_DEVICE_TYPE_GPU
MAX_GROUP_SIZE = 256
LOCAL_MEM_SIZE = 65536
MAX_COMPUTE_UNITS = 24
MAX_WORK_ITEM_DIMENSIONS = 3
dim[0] = 256 dim[1] = 256 dim[2] = 256
=============device=============
DEVICE TYPE = CL_DEVICE_TYPE_CPU
MAX_GROUP_SIZE = 8192
LOCAL_MEM_SIZE = 32768
MAX_COMPUTE_UNITS = 8
MAX_WORK_ITEM_DIMENSIONS = 3
dim[0] = 8192 dim[1] = 8192 dim[2] = 8192
++++++++++++++++++platform+++++++++++++++++++
PLATFORM_NAME = NVIDIA CUDA
PLATFORM_PROFILE = FULL_PROFILE
PLATFORM_VERSION = OpenCL 1.2 CUDA 10.0.150
PLATFORM_VENDOR = NVIDIA Corporation
PLATFORM_EXTENSIONS = cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_fp64 cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_compiler_options cl_nv_device_attribute_query cl_nv_pragma_unroll cl_nv_d3d10_sharing cl_khr_d3d10_sharing cl_nv_d3d11_sharing cl_nv_copy_opts cl_nv_create_buffer
Device count = 1
=============device=============
DEVICE TYPE = CL_DEVICE_TYPE_GPU
MAX_GROUP_SIZE = 1024
LOCAL_MEM_SIZE = 49152
MAX_COMPUTE_UNITS = 4
MAX_WORK_ITEM_DIMENSIONS = 3
dim[0] = 1024 dim[1] = 1024 dim[2] = 64
First and second platforms are identical. I don’t understand how it is possible. I can’t create a pipe for a context which has two devices from first or second platform.
But if I combine devices from first and second platforms then clCreatePipe does’t segfault! This is weird. Also can’t create a context with devices from intel and nvidia platforms but that more or less makes sense.
This works.
#include <iostream>
#define CL_TARGET_OPENCL_VERSION 220
#include <CL/cl.h>
int main(int argc, char* argv[])
{
cl_platform_id platforms[3];
clGetPlatformIDs(3, platforms, nullptr);
cl_device_id devices[2];
clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, 1, &devices[0], nullptr); // device from first platform
clGetDeviceIDs(platforms[1], CL_DEVICE_TYPE_CPU, 1, &devices[1], nullptr); // device from second platform
auto context = clCreateContext(nullptr, 2, devices, nullptr, nullptr, nullptr);
auto pipe = clCreatePipe(context, 0, sizeof(float), 256, nullptr, nullptr);
}
Weird.
it’s working because of context is null. So no context for devices of different platforms.
No pipe working?