что такое спецификатор формата printf для cl_ulong

@ Н2СО3

это мой основной код:

#pragma OPENCL EXTENSION cl_ amd_ printf : enable
#define PROGRAM_FILE "matvec.cl"
#define KERNEL_FUNC "matvec_mult"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#ifdef MAC
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif
int main() {
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_command_queue queue;
cl_int i,err;
cl_int length = 512;
cl_program program;
FILE *program_handle;
char *program_buffer;
size_t program_size;
cl_kernel kernel;
size_t work_units_per_kernel;
float mat_a[length], mat_b[length];
cl_mem mat_a_buff, mat_b_buff, res_buff;
cl_event timing_event;
cl_ulong time_start, time_end , read_time;

//********************************************************************
//           making matrix a & b

for(i=0; i<length; i++) {
mat_a[i] = i ;
mat_b[i] = i +1;
}
//********************************************************************

clGetPlatformIDs(2, &platform, NULL);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1 , &device, NULL);
context = clCreateContext(NULL, 1, &device, NULL,NULL, &err);
program_handle = fopen(PROGRAM_FILE, "r");
fseek(program_handle, 0, SEEK_END);
program_size = ftell(program_handle);
rewind(program_handle);
program_buffer = (char*)malloc(program_size + 1);
program_buffer[program_size] = '\0';

//*******************************************************************
// !!!!!!!!!   reading buffer  :    
fread(program_buffer, sizeof(char), program_size,program_handle);
//*******************************************************************   
fclose(program_handle);
program = clCreateProgramWithSource(context, 1,(const char**)&program_buffer,&program_size,&err);
free(program_buffer);

clBuildProgram(program, 0 , NULL , NULL , NULL , NULL);

// !!!    Creating & Queueing Kernel  :
//*********************************************************************************

kernel = clCreateKernel(program , KERNEL_FUNC , &err);
queue = clCreateCommandQueue(context, device , CL_QUEUE_PROFILING_ENABLE , &err);

//*********************************************************************************
mat_a_buff = clCreateBuffer(context, CL_MEM_READ_ONLY |CL_MEM_COPY_HOST_PTR,
sizeof(float)*4,  mat_a, &err);
mat_b_buff = clCreateBuffer(context, CL_MEM_READ_ONLY |CL_MEM_COPY_HOST_PTR,
sizeof(float)*4 , mat_b, &err);
res_buff = clCreateBuffer(context, CL_MEM_WRITE_ONLY,sizeof(float)*4, NULL, &err);

// !!!   Setting Kernel Arguments   :   


clSetKernelArg(kernel, 0, sizeof(cl_mem), &mat_a_buff);
clSetKernelArg(kernel, 0, sizeof(cl_mem), &mat_b_buff);
clSetKernelArg(kernel, 1, sizeof(cl_mem), &res_buff);


work_units_per_kernel = 512;

//   !!!  Parallelism with clEnqueueNDRangekernel structure 
//**********************************************************************************************    
clEnqueueNDRangeKernel(queue, kernel, 1, NULL,&work_units_per_kernel,
NULL, 0, NULL, &timing_event);
//**********************************************************************************************    

//********************  Profilling :  *****************************

clGetEventProfilingInfo(timing_event, CL_PROFILING_COMMAND_START,
sizeof(time_start), &time_start, NULL);
clGetEventProfilingInfo(timing_event, CL_PROFILING_COMMAND_END,
sizeof(time_end), &time_end, NULL);
read_time = time_end - time_start;
printf("The average time is :  %lu\n", read_time);                  
//********************************************************************************************* 
clReleaseMemObject(mat_a_buff);
clReleaseMemObject(mat_b_buff);
clReleaseMemObject(res_buff);
clReleaseKernel(kernel);
clReleaseCommandQueue(queue);
clReleaseProgram(program);
clReleaseContext(context);
return 0;
}   

но хотя cl_ulong - это беззнаковое длинное, printf с флагом% lu не действует. это строка кода ошибки: (формат% lu ожидает аргумент типа long unsigned int, но аргумент 2 имеет тип cl_ulong [-Wformat])

так что я не знаю, в чем проблема и почему printf не работает должным образом ???

4 голоса | спросил mehdi oraki 26 J0000006Europe/Moscow 2013, 04:42:18

5 ответов


0

В заголовке cl_platform.h, установленном на моей машине, я обнаружил, что cl_ulong определен как:

typedef uint64_t  cl_ulong;

Так что, я думаю, вы можете попытаться распечатать как предложено здесь .

Кстати, я не знаю, используете ли вы прагму для чего-то еще в вашем коде, но здесь используется printf, который вы используете в обычном C, поскольку это код на стороне хоста. Так что нет необходимости в прагме в этом конкретном случае. Более того, начиная с OpenCL 1.2, printf является частью встроенных функций, что делает устаревшим расширение от AMD и, следовательно, прагму.

ответил CaptainObvious 26 J0000006Europe/Moscow 2013, 13:08:01
0

AFAIK, спецификация OpenCL, но не определяет спецификаторы формата printf для целочисленных типов, но он фактически предписывает cl_ulong будет 64-разрядным целым числом. Это может не совпадать с типом C unsigned long, который по стандарту C не должен быть таким широким и может быть только 32-разрядным. Но unsigned long long гарантированно может содержать 64-разрядное целое число.

Итак, я бы посоветовал вам:

  • приведите cl_ulong в unsigned long long и используйте %llu или;
  • приведите cl_ulong к uint64_t и используйте спецификатор формата PRIo64.

Бот unsigned long long и uint64_t были представленный C99, поэтому нет большой разницы в мобильности. В обоих случаях конверсия должна быть без потерь и может только увеличивать ценность.

Использование выглядит следующим образом:

printf("The average time is: %llu\n", (unsigned long long)read_time); 

или следующее:

#include <inttypes.h>
printf("The average time is: %"PRIu64"\n", (uint64_t)read_time); 
ответил firegurafiku 3 AMpSun, 03 Apr 2016 02:16:58 +030016Sunday 2016, 02:16:58
0

Если номенклатура OpenCL имеет смысл, я ожидаю, что ulong будет typedef для unsigned long, следовательно, правильным спецификатором преобразования будет %lu.

ответил 26 J0000006Europe/Moscow 2013, 04:44:32
0

Как один из других упомянутых ответов, размеры скалярных типов данных OpenCL являются постоянным числом битов:

DATA TYPE            | BITS
===========================
cl_char  / cl_uchar  |    8
cl_short / cl_ushort |   16
cl_int   / cl_uint   |   32
cl_long  / cl_ulong  |   64

Однако, поскольку вы не можете принять размер long в данной системе, используя %llu или %lu будет неверно .


Тем не менее, C и C ++ имеют inttypes.h header , который определяет макросы для печати целочисленных значений фиксированного размера.
Макросы печати имеют вид PRI[format][size] :

  • [format] является одним из: d - подписано, u - без знака, o - восьмеричное, x - hex
  • [size] - это целочисленный размер в битах (8, 16, 32 или 64)

Например: PRIu64 используется для печати 64-разрядного целого числа без знака и PRIx32 используется для вывода 32-разрядного целого числа в шестнадцатеричном виде.

Примечание. Эти макросы определяют только раздел «спецификатор» переменной printf, а не ---- +: = 19 =: + ---- маркер.
Когда вы используете их в программе, она должна выглядеть следующим образом: %


Собрав все вышесказанное, мы получим следующее:

printf("X = %" PRIu32 "\n", x);

Конечно, если вы предпочитаете печатать целое число в восьмеричном виде, вы бы использовали DATA TYPE | FORMAT =================== cl_char | PRId8 cl_uchar | PRIu8 cl_short | PRId16 cl_ushort | PRIu16 cl_int | PRId32 cl_uint | PRIu32 cl_long | PRId64 cl_ulong | PRIu64 вместо o или d.
Аналогичным образом, если вы хотите получить целое число в шестнадцатеричном формате, вместо этого вы должны использовать u.

ответил Mr. Llama 1 FriEurope/Moscow2017-12-01T20:33:57+03:00Europe/Moscow12bEurope/MoscowFri, 01 Dec 2017 20:33:57 +0300 2017, 20:33:57
0

Если это 64-битный тип, попробуйте% lld (long long).

ответил chrisjhebert1973 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 18 Sep 2013 00:53:09 +0400 2013, 00:53:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132