| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012  Centre National de la Recherche Scientifique * Copyright (C) 2011  Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */#include <config.h>#include <starpu.h>#include "../test_interfaces.h"#include "../../../helper.h"/* * XXX : These values should not be changed. If you really understand all that * BCSR stuff, feel free to write a better example :) *//* Size of the matrix */#define WIDTH          4#define HEIGHT         4#define SIZE           (WIDTH * HEIGHT)/* Size of the blocks */#define R              2#define C              2#define BLOCK_SIZE     (R*C)/* The matrix is simply 0 1 2... There are SIZE-1 non zero values... */#define NNZ            (SIZE-1)/* ... and SIZE/BLOCK_SIZE non zero blocks */#define NNZ_BLOCKS     (SIZE/BLOCK_SIZE)#ifdef STARPU_USE_CPUstatic void test_bcsr_cpu_func(void *buffers[], void *args);#endif /* !STARPU_USE_CPU */#ifdef STARPU_USE_CUDAextern void test_bcsr_cuda_func(void *buffers[], void *_args);#endif#ifdef STARPU_USE_OPENCLextern void test_bcsr_opencl_func(void *buffers[], void *args);#endifstatic int nzval[NNZ];static int nzval2[NNZ];static uint32_t colind[NNZ_BLOCKS];static uint32_t colind2[NNZ_BLOCKS];static uint32_t rowptr[1+WIDTH/R];static uint32_t rowptr2[1+WIDTH/R];static starpu_data_handle_t bcsr_handle;static starpu_data_handle_t bcsr2_handle;struct test_config bcsr_config ={#ifdef STARPU_USE_CPU	.cpu_func      = test_bcsr_cpu_func,#endif /* !STARPU_USE_CPU */#ifdef STARPU_USE_CUDA	.cuda_func     = test_bcsr_cuda_func,#endif /* !STARPU_USE_CUDA */#ifdef STARPU_USE_OPENCL	.opencl_func   = test_bcsr_opencl_func,#endif /* !STARPU_USE_OPENCL */	.handle        = &bcsr_handle,	.dummy_handle  = &bcsr2_handle,	.copy_failed   = 0,	.name          = "bcsr_interface"};static voidregister_data(void){	int i;	for (i = 0; i < SIZE; i++)		nzval[i] = i;	colind[0] = 0;	colind[1] = 2;	colind[2] = 0;	colind[3] = 2;	rowptr[0] = 0;	rowptr[1] = 2;	rowptr[2] = 4;		starpu_bcsr_data_register(&bcsr_handle,				  0,				  NNZ_BLOCKS,				  HEIGHT/R,				  (uintptr_t) nzval,				  colind,				  rowptr,				  0,				  R,				  C,				  sizeof(nzval[0]));	starpu_bcsr_data_register(&bcsr2_handle,				  0,				  NNZ_BLOCKS,				  HEIGHT/R,				  (uintptr_t) nzval2,				  colind2,				  rowptr2,				  0,				  R,				  C,				  sizeof(nzval2[0]));}static voidunregister_data(void){	starpu_data_unregister(bcsr_handle);	starpu_data_unregister(bcsr2_handle);}static voidtest_bcsr_cpu_func(void *buffers[], void *args){	STARPU_SKIP_IF_VALGRIND;	int *val;	int factor;	int i;	uint32_t nnz = STARPU_BCSR_GET_NNZ(buffers[0]);	val = (int *) STARPU_BCSR_GET_NZVAL(buffers[0]);	factor = *(int *) args;	for (i = 0; i < nnz; i++)	{		if (val[i] != i * factor)		{			bcsr_config.copy_failed = 1;			return;		}		val[i] *= -1;	}	/* Check colind */	uint32_t *col = STARPU_BCSR_GET_COLIND(buffers[0]);	for (i = 0; i < NNZ_BLOCKS; i++)		if (col[i] != colind[i])			bcsr_config.copy_failed = 1;	/* Check rowptr */	uint32_t *row = STARPU_BCSR_GET_ROWPTR(buffers[0]);	for (i = 0; i < 1 + WIDTH/R; i++)		if (row[i] != rowptr[i])			bcsr_config.copy_failed = 1;}intmain(void){	data_interface_test_summary *summary;	struct starpu_conf conf =	{		.ncpus   = -1,		.ncuda   = 2,		.nopencl = 1	};	if (starpu_init(&conf) == -ENODEV)		return STARPU_TEST_SKIPPED;	register_data();	summary = run_tests(&bcsr_config);	if (!summary)		exit(EXIT_FAILURE);	unregister_data();	starpu_shutdown();	data_interface_test_summary_print(stderr, summary);	return data_interface_test_summary_success(summary);}
 |