Difference between revisions of "Team Name (Official)"

From CDOT Wiki
Jump to: navigation, search
(Assignment 2)
(Assignment 2)
Line 16: Line 16:
  
 
=== Assignment 2 ===
 
=== Assignment 2 ===
We chose to work on the program that finds out how many primes are between 1 and N.
+
A2 featured a significantly improved prime-counting algorithm, coupled with GPU integration.
  
Assignment 2 was very successful.
 
  
We are submitting the files now (7:00pm April 11th).
+
Going from A1 to A2, our code experienced a speed-up of 6,015,300% (or 60,154x faster (literally - A1 was <u>'''''that'''''</u> inefficient)).
  
This Wiki page will be updated with details before A3's due date (11:55pm April 12th).
+
 
 +
Kernel code for A2:
 +
 
 +
<pre>__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];
 +
}</pre>
 +
 
 +
 
 +
Sample output from A2, for demonstration:
 +
 
 +
[[Image:gtsmyth A2.png|widthpx| ]]
 +
 
 +
 
 +
 
 +
 
 +
Demonstration of how efficient A2 runs for n = 1,000 (for comparison, A1 took 20.78 seconds).
  
 
=== Assignment 1 ===
 
=== Assignment 1 ===

Revision as of 23:38, 11 April 2013


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).

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;

}