feat(warmup): add solutions
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include "cudas.h"
|
||||
#include "GM.h"
|
||||
#include "Kernel.h"
|
||||
#include "Hardware.h"
|
||||
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
@@ -32,9 +33,34 @@ static __global__ void kaddArray(float* ptrGMV1 , float* ptrGMV2 , float* ptrGMW
|
||||
* ptrW receptionne le resultat
|
||||
* n nombre de case
|
||||
*/
|
||||
__host__ bool addArray_procedurale(float* ptrV1 , float* ptrV2 , float* ptrW , int n) // __host__ facultatif
|
||||
__host__ void addArray_procedurale(float* ptrV1 , float* ptrV2 , float* ptrW , int n) // __host__ facultatif
|
||||
{
|
||||
// TODO addArray
|
||||
size_t sizeVector = sizeof(float) * n;
|
||||
|
||||
float* ptrGMV1;
|
||||
float* ptrGMV2;
|
||||
float* ptrGMW;
|
||||
|
||||
GM::malloc(&ptrGMV1, sizeVector);
|
||||
GM::malloc(&ptrGMV2, sizeVector);
|
||||
GM::malloc(&ptrGMW, sizeVector);
|
||||
|
||||
GM::memcpyHToD(ptrGMV1, ptrV1, sizeVector);
|
||||
GM::memcpyHToD(ptrGMV2, ptrV2, sizeVector);
|
||||
|
||||
const int MP = Hardware::getMPCount();
|
||||
const int CORE_MP = Hardware::getCoreCountMP();
|
||||
|
||||
dim3 dg(MP, 3, 1);
|
||||
dim3 db(CORE_MP, 2, 1); // <=1024
|
||||
|
||||
kaddArray<<<dg,db>>>( ptrGMV1 , ptrGMV2 , ptrGMW , n);
|
||||
|
||||
GM::memcpyDToH(ptrW, ptrGMW, sizeVector);
|
||||
|
||||
GM::free(ptrGMV1);
|
||||
GM::free(ptrGMV2);
|
||||
GM::free(ptrGMW);
|
||||
}
|
||||
|
||||
/*--------------------------------------*\
|
||||
@@ -50,8 +76,12 @@ __global__ void kaddArray(float* ptrGMV1 , float* ptrGMV2 , float* ptrGMW , int
|
||||
const int TID = Thread2D::tid();
|
||||
|
||||
// pattern entrelacement
|
||||
|
||||
// TODO addArray
|
||||
int s = TID;
|
||||
while (s < n)
|
||||
{
|
||||
ptrGMW[s] = ptrGMV1[s] + ptrGMV2[s];
|
||||
s += NB_THREAD;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*\
|
||||
|
||||
@@ -37,16 +37,17 @@ bool exemple_addArray_procedurale()
|
||||
ArrayTools::print(ptrV2, n);
|
||||
cout << "--------------------------------------------------------------------" << endl;
|
||||
ArrayTools::print(ptrW, n);
|
||||
cout<<endl;
|
||||
}
|
||||
|
||||
// Delete
|
||||
{
|
||||
delete ptrV1;
|
||||
delete ptrV1;
|
||||
delete ptrV2;
|
||||
delete ptrW;
|
||||
}
|
||||
|
||||
return isOk;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*\
|
||||
|
||||
@@ -11,23 +11,18 @@
|
||||
/**
|
||||
* output : void required, because kernel is asynchrone
|
||||
*/
|
||||
__global__ void addArray(float* ptrGMV1 , float* ptrGMV2 , float* ptrGMW , int n)
|
||||
{
|
||||
__global__ void addArray(float* ptrGMV1 , float* ptrGMV2 , float* ptrGMW , int n) {
|
||||
const int NB_THREAD = Thread2D::nbThread();
|
||||
const int TID = Thread2D::tid();
|
||||
|
||||
// Debug, facultatif
|
||||
// if (TID == 0)
|
||||
// {
|
||||
// printf("Coucou from device tid = %d", TID);
|
||||
// }
|
||||
|
||||
// pattern entrelacement
|
||||
|
||||
// TODO addArray
|
||||
}
|
||||
int s = TID;
|
||||
while (s < n) {
|
||||
ptrGMW[s] = ptrGMV1[s] + ptrGMV2[s];
|
||||
s += NB_THREAD;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*\
|
||||
|* End *|
|
||||
\*---------------------------------------------------------------------*/
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ using std::endl;
|
||||
using std::to_string;
|
||||
using std::string;
|
||||
|
||||
|
||||
/*--------------------------------------*\
|
||||
|* Imported *|
|
||||
\*-------------------------------------*/
|
||||
@@ -33,26 +32,24 @@ AddArray::AddArray(const Grid& grid , float* ptrV1 , float* ptrV2 , float* ptrW
|
||||
ptrW(ptrW), //
|
||||
n(n), //
|
||||
dg(grid.dg), //
|
||||
db(grid.db)
|
||||
{
|
||||
this->sizeVector = -1; // TODO addArray // octet
|
||||
db(grid.db) {
|
||||
this->sizeVector = sizeof(float) * n;
|
||||
|
||||
// MM (malloc Device)
|
||||
{
|
||||
GM::malloc(&ptrGMV1, sizeVector);
|
||||
// TODO addArray
|
||||
}
|
||||
// MM (malloc Device)
|
||||
{
|
||||
GM::malloc(&ptrGMV1, sizeVector);
|
||||
GM::malloc(&ptrGMV2, sizeVector);
|
||||
GM::malloc(&ptrGMW, sizeVector);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
AddArray::~AddArray()
|
||||
{
|
||||
AddArray::~AddArray() {
|
||||
//MM (device free)
|
||||
{
|
||||
GM::free(ptrGMV1);
|
||||
// TODO addArray
|
||||
}
|
||||
}
|
||||
GM::free(ptrGMV2);
|
||||
GM::free(ptrGMW);
|
||||
}
|
||||
|
||||
/*--------------------------------------*\
|
||||
|* Methode *|
|
||||
@@ -61,23 +58,23 @@ AddArray::~AddArray()
|
||||
/**
|
||||
* override
|
||||
*/
|
||||
void AddArray::run()
|
||||
{
|
||||
void AddArray::run() {
|
||||
// MM (copy Host->Device)
|
||||
{
|
||||
GM::memcpyHToD(ptrGMV1, ptrV1, sizeVector);
|
||||
// TODO addArray
|
||||
{
|
||||
GM::memcpyHToD(ptrGMV1, ptrV1, sizeVector);
|
||||
GM::memcpyHToD(ptrGMV2, ptrV2, sizeVector);
|
||||
}
|
||||
|
||||
// TODO addArray // call kernel // assynchrone
|
||||
|
||||
addArray<<<dg,db>>>( ptrGMV1 , ptrGMV2 , ptrGMW , n);
|
||||
|
||||
//Kernel::synchronize();// inutile
|
||||
|
||||
// MM (Device -> Host)
|
||||
{
|
||||
// TODO addArray // MM barier de synchronisation implicite
|
||||
GM::memcpyDToH(ptrW, ptrGMW, sizeVector);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*\
|
||||
|* End *|
|
||||
|
||||
@@ -9,8 +9,7 @@
|
||||
\*---------------------------------------------------------------------*/
|
||||
|
||||
|
||||
class AddArray
|
||||
{
|
||||
class AddArray {
|
||||
/*--------------------------------------*\
|
||||
|* Constructor *|
|
||||
\*-------------------------------------*/
|
||||
|
||||
@@ -45,12 +45,13 @@ bool exemple_addArray_object()
|
||||
ArrayTools::print(ptrV2, n);
|
||||
cout << "--------------------------------------------------------------------" << endl;
|
||||
ArrayTools::print(ptrW, n);
|
||||
cout<<endl;
|
||||
}
|
||||
|
||||
// Delete
|
||||
{
|
||||
delete ptrV1;
|
||||
delete ptrV1;
|
||||
delete ptrV2;
|
||||
delete ptrW;
|
||||
}
|
||||
|
||||
@@ -69,16 +70,10 @@ static Grid createGrid()
|
||||
const int MP = Hardware::getMPCount();
|
||||
const int CORE_MP = Hardware::getCoreCountMP();
|
||||
|
||||
dim3 dg(1, 1, 1); // TODO addArray
|
||||
dim3 db(1, 1, 1); // TODO addArray // produit <=1024
|
||||
dim3 dg(MP, 2, 1);
|
||||
dim3 db(CORE_MP, 3, 1); // produit <=1024
|
||||
Grid grid(dg, db);
|
||||
|
||||
// to remove once coded
|
||||
{
|
||||
Couts::redln("aie aie aie, your best grid won t build itself");
|
||||
assert(false);
|
||||
}
|
||||
|
||||
return grid;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,12 +45,13 @@ bool exemple_addArray_11()
|
||||
ArrayTools::print(ptrV2, n);
|
||||
cout << "--------------------------------------------------------------------" << endl;
|
||||
ArrayTools::print(ptrW, n);
|
||||
cout<<endl;
|
||||
}
|
||||
|
||||
// Delete
|
||||
{
|
||||
delete ptrV1;
|
||||
delete ptrV1;
|
||||
delete ptrV2;
|
||||
delete ptrW;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "Couts.h"
|
||||
#include "Hardware.h"
|
||||
|
||||
using std::cerr;
|
||||
using std::cout;
|
||||
@@ -29,17 +30,29 @@ static void scalar(bool& isOk);
|
||||
|
||||
int main(int argc , char** argv)
|
||||
{
|
||||
// Facultatif
|
||||
{
|
||||
Hardware::loadCudaDriverAll();
|
||||
Hardware::printAllSimple();
|
||||
|
||||
const int DEVICE_ID = 0;
|
||||
Hardware::setDevice(DEVICE_ID);
|
||||
}
|
||||
|
||||
const int IS_VERBOSE = true;
|
||||
|
||||
bool isOk = true;
|
||||
// run
|
||||
{
|
||||
bool isOk = true;
|
||||
|
||||
// Commenter ce dont vous n'avez pas besoin ci-dessous
|
||||
scalar(isOk); // commenter dans la methode ci-dessous ce que vous ne voulez pas lancer
|
||||
array(isOk); // commenter dans la methode ci-dessous ce que vous ne voulez pas lancer
|
||||
// Commenter ce dont vous n'avez pas besoin ci-dessous
|
||||
//scalar(isOk); // commenter dans la methode ci-dessous ce que vous ne voulez pas lancer
|
||||
array(isOk); // commenter dans la methode ci-dessous ce que vous ne voulez pas lancer
|
||||
|
||||
Couts::statusln(isOk);
|
||||
Couts::statusln(isOk);
|
||||
|
||||
return isOk ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
return isOk ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------*\
|
||||
@@ -56,7 +69,7 @@ static void array(bool& isOk)
|
||||
{
|
||||
isOk &= exemple_addArray_procedurale();
|
||||
isOk &= exemple_addArray_object();
|
||||
isOk &= exemple_addArray_11();
|
||||
// isOk &= exemple_addArray_11();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*\
|
||||
|
||||
Reference in New Issue
Block a user