Blame src/components/cuda/tests/HelloWorld.cu

Packit Service a1973e
/****************************/
Packit Service a1973e
/* THIS IS OPEN SOURCE CODE */
Packit Service a1973e
/****************************/
Packit Service a1973e
Packit Service a1973e
/** 
Packit Service a1973e
 * @file    HelloWorld.c
Packit Service a1973e
 * @author  Heike Jagode
Packit Service a1973e
 *          jagode@eecs.utk.edu
Packit Service a1973e
 * Mods:	<your name here>
Packit Service a1973e
 *			<your email address>
Packit Service a1973e
 * test case for Example component 
Packit Service a1973e
 * 
Packit Service a1973e
 *
Packit Service a1973e
 * @brief
Packit Service a1973e
 *  This file is a very simple HelloWorld C example which serves (together
Packit Service a1973e
 *	with its Makefile) as a guideline on how to add tests to components.
Packit Service a1973e
 *  The papi configure and papi Makefile will take care of the compilation
Packit Service a1973e
 *	of the component tests (if all tests are added to a directory named
Packit Service a1973e
 *	'tests' in the specific component dir).
Packit Service a1973e
 *	See components/README for more details.
Packit Service a1973e
 *
Packit Service a1973e
 *	The string "Hello World!" is mangled and then restored.
Packit Service a1973e
 */
Packit Service a1973e
Packit Service a1973e
#include <cuda.h>
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
Packit Service a1973e
#define NUM_EVENTS 1
Packit Service a1973e
#define PAPI 1
Packit Service a1973e
Packit Service a1973e
// Prototypes
Packit Service a1973e
__global__ void helloWorld(char*);
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
// Host function
Packit Service a1973e
int main(int argc, char** argv)
Packit Service a1973e
{
Packit Service a1973e
#ifdef PAPI
Packit Service a1973e
	int retval, i;
Packit Service a1973e
	int EventSet = PAPI_NULL;
Packit Service a1973e
	long long values[NUM_EVENTS];
Packit Service a1973e
	/* REPLACE THE EVENT NAME 'PAPI_FP_OPS' WITH A CUDA EVENT 
Packit Service a1973e
	   FOR THE CUDA DEVICE YOU ARE RUNNING ON.
Packit Service a1973e
	   RUN papi_native_avail to get a list of CUDA events that are 
Packit Service a1973e
	   supported on your machine */
Packit Service a1973e
        //char *EventName[] = { "PAPI_FP_OPS" };
Packit Service a1973e
        char const *EventName[] = { "cuda:::event:elapsed_cycles_sm:device=0" };
Packit Service a1973e
	int events[NUM_EVENTS];
Packit Service a1973e
	int eventCount = 0;
Packit Service a1973e
	int quiet;
Packit Service a1973e
Packit Service a1973e
	/* Set TESTS_QUIET variable */
Packit Service a1973e
	quiet=tests_quiet( argc, argv );
Packit Service a1973e
	
Packit Service a1973e
	/* PAPI Initialization */
Packit Service a1973e
	retval = PAPI_library_init( PAPI_VER_CURRENT );
Packit Service a1973e
	if( retval != PAPI_VER_CURRENT ) {
Packit Service a1973e
		if (!quiet) printf("PAPI init failed\n");
Packit Service a1973e
		test_fail(__FILE__,__LINE__,
Packit Service a1973e
			"PAPI_library_init failed", 0 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf( "PAPI_VERSION     : %4d %6d %7d\n",
Packit Service a1973e
			PAPI_VERSION_MAJOR( PAPI_VERSION ),
Packit Service a1973e
			PAPI_VERSION_MINOR( PAPI_VERSION ),
Packit Service a1973e
			PAPI_VERSION_REVISION( PAPI_VERSION ) );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* convert PAPI native events to PAPI code */
Packit Service a1973e
	for( i = 0; i < NUM_EVENTS; i++ ){
Packit Service a1973e
                retval = PAPI_event_name_to_code( (char *)EventName[i], &events[i] );
Packit Service a1973e
		if( retval != PAPI_OK ) {
Packit Service a1973e
			fprintf( stderr, "PAPI_event_name_to_code failed\n" );
Packit Service a1973e
			continue;
Packit Service a1973e
		}
Packit Service a1973e
		eventCount++;
Packit Service a1973e
		if (!quiet) printf( "Name %s --- Code: %#x\n", EventName[i], events[i] );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* if we did not find any valid events, just report test failed. */
Packit Service a1973e
	if (eventCount == 0) {
Packit Service a1973e
		if (!quiet) printf( "Test FAILED: no valid events found.\n");
Packit Service a1973e
		test_skip(__FILE__,__LINE__,"No events found",0);
Packit Service a1973e
		return 1;
Packit Service a1973e
	}
Packit Service a1973e
	
Packit Service a1973e
	retval = PAPI_create_eventset( &EventSet );
Packit Service a1973e
	if( retval != PAPI_OK ) {
Packit Service a1973e
		if (!quiet) printf( "PAPI_create_eventset failed\n" );
Packit Service a1973e
		test_fail(__FILE__,__LINE__,"Cannot create eventset",retval);
Packit Service a1973e
	}	
Packit Service a1973e
Packit Service a1973e
        // If multiple GPUs/contexts were being used, 
Packit Service a1973e
        // you need to switch to each device before adding its events
Packit Service a1973e
        // e.g. cudaSetDevice( 0 );
Packit Service a1973e
	retval = PAPI_add_events( EventSet, events, eventCount );
Packit Service a1973e
	if( retval != PAPI_OK ) {
Packit Service a1973e
		fprintf( stderr, "PAPI_add_events failed\n" );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_start( EventSet );
Packit Service a1973e
	if( retval != PAPI_OK ) {
Packit Service a1973e
		fprintf( stderr, "PAPI_start failed\n" );
Packit Service a1973e
	}
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
	int j;
Packit Service a1973e
	
Packit Service a1973e
	// desired output
Packit Service a1973e
	char str[] = "Hello World!";
Packit Service a1973e
Packit Service a1973e
	// mangle contents of output
Packit Service a1973e
	// the null character is left intact for simplicity
Packit Service a1973e
	for(j = 0; j < 12; j++) {
Packit Service a1973e
		str[j] -= j;
Packit Service a1973e
		//printf("str=%s\n", str);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	
Packit Service a1973e
	// allocate memory on the device
Packit Service a1973e
	char *d_str;
Packit Service a1973e
	size_t size = sizeof(str);
Packit Service a1973e
	cudaMalloc((void**)&d_str, size);
Packit Service a1973e
	
Packit Service a1973e
	// copy the string to the device
Packit Service a1973e
	cudaMemcpy(d_str, str, size, cudaMemcpyHostToDevice);
Packit Service a1973e
	
Packit Service a1973e
	// set the grid and block sizes
Packit Service a1973e
	dim3 dimGrid(2); // one block per word
Packit Service a1973e
	dim3 dimBlock(6); // one thread per character
Packit Service a1973e
Packit Service a1973e
	// invoke the kernel
Packit Service a1973e
	helloWorld<<< dimGrid, dimBlock >>>(d_str);
Packit Service a1973e
Packit Service a1973e
	// retrieve the results from the device
Packit Service a1973e
	cudaMemcpy(str, d_str, size, cudaMemcpyDeviceToHost);
Packit Service a1973e
	
Packit Service a1973e
	// free up the allocated memory on the device
Packit Service a1973e
	cudaFree(d_str);
Packit Service a1973e
	
Packit Service a1973e
	if (!quiet) printf("END: %s\n", str);
Packit Service a1973e
Packit Service a1973e
	
Packit Service a1973e
#ifdef PAPI
Packit Service a1973e
	retval = PAPI_stop( EventSet, values );
Packit Service a1973e
	if( retval != PAPI_OK )
Packit Service a1973e
		fprintf( stderr, "PAPI_stop failed\n" );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_cleanup_eventset(EventSet);
Packit Service a1973e
	if( retval != PAPI_OK )
Packit Service a1973e
		fprintf(stderr, "PAPI_cleanup_eventset failed\n");
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_destroy_eventset(&EventSet);
Packit Service a1973e
	if (retval != PAPI_OK)
Packit Service a1973e
		fprintf(stderr, "PAPI_destroy_eventset failed\n");
Packit Service a1973e
Packit Service a1973e
	PAPI_shutdown();
Packit Service a1973e
Packit Service a1973e
	for( i = 0; i < eventCount; i++ )
Packit Service a1973e
		if (!quiet) printf( "%12lld \t\t --> %s \n", values[i], EventName[i] );
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	test_pass(__FILE__);
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
Packit Service a1973e
// Device kernel
Packit Service a1973e
__global__ void
Packit Service a1973e
helloWorld(char* str)
Packit Service a1973e
{
Packit Service a1973e
	// determine where in the thread grid we are
Packit Service a1973e
	int idx = blockIdx.x * blockDim.x + threadIdx.x;
Packit Service a1973e
	// unmangle output
Packit Service a1973e
	str[idx] += idx;
Packit Service a1973e
}
Packit Service a1973e