/tests/opencl/test.rkt

http://github.com/jeapostrophe/opencl · Racket · 192 lines · 163 code · 28 blank · 1 comment · 20 complexity · 82f81cdb890c71e833e64c2b9fca0ed6 MD5 · raw file

  1. #lang racket
  2. (require ffi/unsafe
  3. ffi/unsafe/cvector
  4. opencl/c
  5. opencl/racket)
  6. (define current-indent (make-parameter 0))
  7. (define-syntax-rule (indent e ...)
  8. (parameterize ([current-indent (add1 (current-indent))])
  9. e ...))
  10. (define (iprintf . args)
  11. (for ([i (in-range (current-indent))])
  12. (printf "\t"))
  13. (apply printf args))
  14. (define kernel-source
  15. (string->bytes/utf-8
  16. #<<END
  17. __kernel void square(
  18. __global float* input,
  19. __global float* output,
  20. const unsigned int count)
  21. {
  22. int i = get_global_id(0);
  23. if(i < count)
  24. output[i] = input[i] * input[i];
  25. }
  26. END
  27. ))
  28. (define HOW-MANY (* 1024 1024 24))
  29. (define input-v (malloc _float HOW-MANY 'raw))
  30. (define output-v (malloc _float HOW-MANY 'raw))
  31. (define how-much-mem (* HOW-MANY (ctype-sizeof _float)))
  32. (iprintf "Initializing vector...~n")
  33. (for ([i (in-range HOW-MANY)])
  34. (ptr-set! input-v _float i (random)))
  35. (iprintf "Vector initialized...~n")
  36. (define (test-context d ctxt)
  37. (clRetainContext ctxt)
  38. (clReleaseContext ctxt)
  39. (iprintf "Supported Image Formats~n")
  40. (indent
  41. (for ([ot (in-list valid-mem-object-types)])
  42. (iprintf "~a = ~a~n"
  43. ot (cvector->list (context-supported-image-formats ctxt empty ot)))))
  44. (local [(define program (clCreateProgramWithSource ctxt (vector kernel-source)))
  45. (define cq (clCreateCommandQueue ctxt d empty))]
  46. (clRetainCommandQueue cq)
  47. (clReleaseCommandQueue cq)
  48. (iprintf "Program infos...~n")
  49. (indent
  50. (for ([pi (in-list valid-program-infos)]
  51. [i (in-range 5)])
  52. (iprintf "~a = ..." pi)
  53. (flush-output)
  54. (define piv (program-info program pi))
  55. (printf " = ~a\n" piv)))
  56. (iprintf "Command queue infos...~n")
  57. (indent
  58. (for ([cqi (in-list valid-command-queue-infos)])
  59. (iprintf "~a = ~a~n" cqi (command-queue-info cq cqi))))
  60. (iprintf "Compiling the program...~n")
  61. (clBuildProgram program (vector d) #"")
  62. (iprintf "Program build infos...~n")
  63. (indent
  64. (for ([pi (in-list valid-program-build-infos)])
  65. (iprintf "~a = ~a~n" pi (program-build-info program d pi))))
  66. (iprintf "How many kernels: ~a~n"
  67. (clCreateKernelsInProgram:count program))
  68. (local [(define kernel (clCreateKernel program #"square"))
  69. (define input (clCreateBuffer ctxt 'CL_MEM_READ_ONLY how-much-mem #f))
  70. (define output (clCreateBuffer ctxt 'CL_MEM_WRITE_ONLY how-much-mem #f))
  71. (define input-evt
  72. (clEnqueueWriteBuffer cq input 'CL_FALSE 0 how-much-mem input-v (vector)))]
  73. (iprintf "Kernel infos...~n")
  74. (indent
  75. (for ([ki (in-list valid-kernel-infos)])
  76. (iprintf "~a = ~a~n" ki (kernel-info kernel ki))))
  77. (iprintf "Kernel Work Group infos...~n")
  78. (indent
  79. (for ([ki (in-list valid-kernel-work-group-infos)])
  80. (iprintf "~a = ~a~n" ki (kernel-work-group-info kernel d ki))))
  81. (iprintf "Input buffer infos...~n")
  82. (indent
  83. (for ([mi (in-list valid-mem-infos)])
  84. (iprintf "~a = ~a~n" mi (memobj-info input mi))))
  85. (iprintf "Output buffer infos...~n")
  86. (indent
  87. (for ([mi (in-list valid-mem-infos)])
  88. (iprintf "~a = ~a~n" mi (memobj-info output mi))))
  89. (iprintf "input-evt infos...~n")
  90. (indent
  91. (for ([i (in-list valid-event-infos)])
  92. (iprintf "~a = ~a~n" i (event-info input-evt i))))
  93. (clSetKernelArg:_cl_mem kernel 0 input)
  94. (clSetKernelArg:_cl_mem kernel 1 output)
  95. (clSetKernelArg:_cl_uint kernel 2 HOW-MANY)
  96. (local
  97. [(define work-group-size (kernel-work-group-info kernel d 'CL_KERNEL_WORK_GROUP_SIZE))
  98. (define kernel-evt
  99. (clEnqueueNDRangeKernel cq kernel 1 (vector HOW-MANY) (vector work-group-size) (vector input-evt)))
  100. (define output-evt
  101. (clEnqueueReadBuffer cq output 'CL_FALSE 0 how-much-mem output-v (vector kernel-evt)))]
  102. (iprintf "kernel-evt infos...~n")
  103. (indent
  104. (for ([i (in-list valid-event-infos)])
  105. (iprintf "~a = ~a~n" i (event-info kernel-evt i))))
  106. (iprintf "output-evt infos...~n")
  107. (indent
  108. (for ([i (in-list valid-event-infos)])
  109. (iprintf "~a = ~a~n" i (event-info output-evt i))))
  110. (clFinish cq)
  111. (iprintf "kernel-evt profiling infos...~n")
  112. (indent
  113. (for ([i (in-list valid-profiling-infos)])
  114. (iprintf "~a = ~a~n" i
  115. (with-handlers ([exn:fail? (lambda (x) "[Not available]")])
  116. (event-profiling-info kernel-evt i))))))
  117. (local [(define i (random HOW-MANY))]
  118. (define iv (ptr-ref input-v _float i))
  119. (define ov (ptr-ref output-v _float i))
  120. (iprintf "~a. input[~a] opencl-output[~a] racket-output[~a]~n"
  121. i iv ov (* iv iv)))
  122. (clReleaseMemObject input)
  123. (clReleaseMemObject output)
  124. (clReleaseKernel kernel))
  125. (clReleaseProgram program)
  126. (clReleaseCommandQueue cq))
  127. (clReleaseContext ctxt))
  128. (define (query-context ctxt)
  129. (for ([ci (in-list valid-context-infos)])
  130. (iprintf "~a = ~a~n"
  131. ci (context-info ctxt ci))))
  132. ; XXX #f is supposed to be allowed by the driver, but may not be
  133. (for ([p (in-list (cvector->list (system-platforms)))])
  134. (iprintf "Platform is ~a~n" p)
  135. (indent
  136. (iprintf "Platform Info~n")
  137. (indent
  138. (for ([name (in-list valid-platform-infos)])
  139. (iprintf "~a = ~a~n"
  140. name (platform-info p name))))
  141. (iprintf "Devices~n")
  142. (indent
  143. (for ([dty (in-list valid-device-types)])
  144. (iprintf "Device Type: ~a~n" dty)
  145. (indent
  146. (for ([d (in-list
  147. (with-handlers ([exn:fail? (lambda (x) empty)])
  148. (cvector->list (platform-devices p dty))))])
  149. (iprintf "Device ~a~n" d)
  150. (indent
  151. (for ([di (in-list valid-device-infos)])
  152. (iprintf "~a = ~a~n" di (device-info d di)))
  153. (iprintf "~n")
  154. (iprintf "Getting context from device: ~e~n" d)
  155. (indent
  156. (local [(define ctxt (clCreateContext #f (vector d)))]
  157. (query-context ctxt)
  158. (test-context d ctxt)))))
  159. (iprintf "Getting context from device type: ~e~n" dty)
  160. (indent
  161. (with-handlers ([exn:fail? void])
  162. (local [(define ctxt (clCreateContextFromType dty))]
  163. (query-context ctxt)
  164. (clReleaseContext ctxt)))))))))