275 XACC_DEBUG(
"pack_vector, dst=%p, dst_off=%zd, src=%p, src_off=%zd, blklen=%zd, stride=%zd, count=%zd, typesize=%zd, queue=%p, is_blocking=%d\n",
276 dst_mem, dst_offset, src_mem, src_offset, blocklength, stride, count, typesize, queue, is_blocking);
278 const int numThreads = 128;
284 size_t blocklength_e = blocklength / typesize;
285 size_t stride_e = stride / typesize;
286 size_t dst_offset_e = dst_offset / typesize;
287 size_t src_offset_e = src_offset / typesize;
289 #ifdef _XMP_XACC_PZCL
290 const int max_num_threads = 8192;
291 int num_threads = ADJUST_GLOBAL_WORK_SIZE(blocklength_e * count);
293 cl_uint work_dim = 1;
294 size_t global_work_size[] = {num_threads};
295 size_t local_work_size[] = {8};
297 if(global_work_size[0] > 8192 || global_work_size[0] % 128 != 0){
298 _XMP_fatal(
"invalid global_work_size at pack vector");
303 if(blocklength_e >= numThreads){
306 while(tx < blocklength_e){
310 ty = numThreads / tx;
311 by = (count-1)/ty + 1;
313 cl_uint work_dim = 2;
314 size_t global_work_size[] = {bx*tx, by*ty};
315 size_t local_work_size[] = {tx, ty};
318 void *args[] = {&dst_mem, &dst_offset_e, &src_mem, &src_offset_e, &blocklength_e, &stride_e, &count};
319 size_t arg_sizes[] = {
sizeof(dst_mem),
sizeof(dst_offset_e),
sizeof(src_mem),
sizeof(src_offset_e),
sizeof(blocklength_e),
sizeof(stride_e),
sizeof(count)};
324 enqueue_kernel(queue, _kernels[_XACC_pack_vector_8], 7, args, arg_sizes, work_dim, global_work_size, local_work_size);
328 enqueue_kernel(queue, _kernels[_XACC_pack_vector_16], 7, args, arg_sizes, work_dim, global_work_size, local_work_size);
332 enqueue_kernel(queue, _kernels[_XACC_pack_vector_32], 7, args, arg_sizes, work_dim, global_work_size, local_work_size);
336 enqueue_kernel(queue, _kernels[_XACC_pack_vector_64], 7, args, arg_sizes, work_dim, global_work_size, local_work_size);
340 void *args_default[] = {&dst_mem, &dst_offset, &src_mem, &src_offset, &blocklength, &stride, &count};
341 size_t arg_sizes_default[] = {
sizeof(dst_mem),
sizeof(dst_offset),
sizeof(src_mem),
sizeof(src_offset),
sizeof(blocklength),
sizeof(stride),
sizeof(count)};
344 enqueue_kernel(queue, _kernels[_XACC_pack_vector_8], 7, args_default, arg_sizes_default, work_dim, global_work_size, local_work_size);
#define CHECK_MULTIPLE(size, base)
Definition: xacc_util_cl.c:267
void _XMP_fatal(char *msg)
Definition: xmp_util.c:42