Basierend auf #10
C:
#include <stdio.h>
#include <CL/cl.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
unsigned long long mem_size = 0;
int err; // error code
cl_device_id device_id; // compute device id
cl_context context; // compute context
cl_mem devTestMem;
cl_uint num_devices=0;
cl_platform_id platformId;
cl_uint numPlatforms = 0;
cl_int fillValue = 255;
err = clGetPlatformIDs(1, &platformId, &numPlatforms);
if (err != CL_SUCCESS)
{
//printf("Number of devices: %u\n", num_devices);
printf("Error: Failed to getPlatforms!\n");
return EXIT_FAILURE;
}
err = clGetDeviceIDs(platformId, CL_DEVICE_TYPE_GPU, 1, &device_id, &num_devices);
if (err != CL_SUCCESS)
{
printf("Error: Failed to create a device group!\n");
if (err == CL_INVALID_PLATFORM) {
printf("Error: CL_INVALID_PLATFORM\n");
}
if (err == CL_INVALID_DEVICE_TYPE) {
printf("Error: CL_INVALID_DEVICE_TYPE\n");
}
if (err == CL_INVALID_VALUE) {
printf("Error: CL_INVALID_VALUE\n");
}
if (err == CL_DEVICE_NOT_FOUND) {
printf("Error: CL_DEVICE_NOT_FOUND\n");
}
return EXIT_FAILURE;
}
context = clCreateContext(0, 1, &device_id, NULL, NULL, &err);
if (err != CL_SUCCESS)
{
printf("Error: Failed to create a compute context!\n");
return EXIT_FAILURE;
}
// get amount of memory to allocate in MB, default to 256
if (argc < 2 || sscanf(argv[1], " %llu", &mem_size) != 1) {
mem_size = 256;
}
mem_size *= 1024 * 1024;; // convert MB to bytes
// allocate GPU memory
devTestMem = clCreateBuffer(context, CL_MEM_READ_WRITE, mem_size, NULL, &err);
if (err!=CL_SUCCESS) {
printf("Error, could not allocate %llu bytes.\n", mem_size);
return EXIT_FAILURE;
}
auto queue= clCreateCommandQueue(context, device_id, !CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);
if (err != CL_SUCCESS) {
printf("Error, could not create queue\n");
return EXIT_FAILURE;
}
// Fill the buffer with the initial value
err = clEnqueueFillBuffer(queue, devTestMem, &fillValue, sizeof(cl_int), 0, mem_size, 0, NULL, NULL);
if (err != CL_SUCCESS) {
printf("Error, could not fill buffer\n");
if (err== CL_INVALID_COMMAND_QUEUE) { printf("CL_INVALID_COMMAND_QUEUE\n"); }
if (err == CL_INVALID_CONTEXT) { printf("CL_INVALID_CONTEXT\n"); }
if (err == CL_INVALID_MEM_OBJECT) { printf("CL_INVALID_MEM_OBJECT \n"); }
if (err == CL_INVALID_VALUE) { printf("CL_INVALID_VALUE\n"); }
if (err == CL_INVALID_EVENT_WAIT_LIST) { printf("CL_INVALID_EVENT_WAIT_LIST \n"); }
if (err == CL_MISALIGNED_SUB_BUFFER_OFFSET) { printf("CL_MISALIGNED_SUB_BUFFER_OFFSET \n"); }
if (err == CL_MEM_OBJECT_ALLOCATION_FAILURE) { printf("CL_MEM_OBJECT_ALLOCATION_FAILURE \n"); }
if (err == CL_OUT_OF_RESOURCES) { printf("CL_OUT_OF_RESOURCES \n"); }
if (err == CL_OUT_OF_HOST_MEMORY) { printf("CL_OUT_OF_HOST_MEMORY \n"); }
return EXIT_FAILURE;
}
clFinish(queue);
// wait for a key press
printf("Press return to exit...\n");
getchar();
// free GPU memory and exit
clReleaseMemObject(devTestMem);
clReleaseContext(context);
return 0;
}