Team Name (Official)

From CDOT Wiki
Revision as of 23:41, 11 April 2013 by Gtsmyth (talk | contribs) (Assignment 2)
Jump to: navigation, search


GPU610/DPS915 | Student List | Group and Project Index | Student Resources | Glossary

Teamname.png

Project Name TBA

Team Members

  1. Graeme Smyth, Some responsibility
  2. Roman Hotin, Some other responsibility

Email All

Progress

Assignment 3

Assignment 3 was very successful.

We are submitting the files now (7:00pm April 11th).

This Wiki page will be updated with details before the due date (11:55pm April 12th).

Assignment 2

A2 featured a significantly improved prime-counting algorithm, coupled with GPU integration.


Going from A1 to A2, our code experienced a speed-up of 6,015,300% (or 60,154x faster (literally - A1 was that inefficient)).


Kernel code for A2:

__global__ void findPrimes(int* answer, int n)
{
	int i = threadIdx.x;
	int j = blockIdx.x * blockDim.x + threadIdx.x;
	__shared__ int blockSum[ntpb];

	int check = j+1;

	blockSum[i] = 0;
	__syncthreads();

	if(check >= 2 && check <= n)
	{
		bool flag = true;			//Assume prime
		for(int x = 2; x < check && flag; x++)	//Check all numbers 2 to "check"
			if(check % x == 0)		//If divisible by x
				flag = false;		//Found to not be prime


		if(flag)			//If prime
			blockSum[i] = 1;	//Add one to our numbers
	}

	__syncthreads();	//Ensure all threads are caught up

	for (int stride = blockDim.x >> 1; stride > 0; stride >>= 1)
	{
		if (i < stride)
			blockSum[i] += blockSum[i + stride];
		__syncthreads();
	}

	if (i == 0)
		answer[blockIdx.x] = blockSum[0];
}


Sample output from A2, for demonstration:

Gtsmyth A2.png



Demonstration of how efficient A2 runs for n = 1,000 (for comparison, A1 took 20.78 seconds).


A2 2.png

Assignment 1

Graeme Smyth

Topic

Making parallel an application which calculates the first n primes.


Roman Hotin

Topic

encrypting text


#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <cctype>

using namespace std;
void Encrypt(string&);
string Decrypt(string strTarget);


int main(int argc, char* argv[]) {
	//initialize and get the string from the user
	string strTarget;
	cout << "Enter a string to encrypt: ";
	//getline(cin,strTarget);
	strTarget = argv[1];
	string temp(strTarget);
	Encrypt(strTarget);

	cout << "Encrypted: " << strTarget << endl;
	cout << "Decrypted: " << Decrypt(strTarget) << endl;

	return 0;
}

void Encrypt(string &strTarget)
{
	int len = strTarget.length();
	char a;
	string strFinal(strTarget);
	for (int i = 0; i <= (len-1); i++)
	{
		a = strTarget.at(i); 
		int b = (int)a; //get the ASCII value of 'a'
		b += 2; //Mulitply the ASCII value by 2
		if (b > 254) { b = 254; }
		a = (char)b; //Set the new ASCII value back into the char
		strFinal.insert(i , 1, a); //Insert the new Character back into the string
	}
	string strEncrypted(strFinal, 0, len);
	strTarget = strEncrypted;
}

string Decrypt(string strTarget)
{
	int len = strTarget.length();
	char a;
	string strFinal(strTarget);
	for (int i = 0; i <= (len-1); i++)
	{
		a = strTarget.at(i);
		int b = (int)a;
		b -= 2;

		a = (char)b;
		strFinal.insert(i, 1, a);
	}
	string strDecrypted(strFinal, 0, len);
	return strDecrypted;
}