Implement the OpenACC device string functions, and device selector

This commit is contained in:
Tom Deakin 2016-05-03 14:50:09 +01:00
parent b45f311e0d
commit 0b0de4e0c3
3 changed files with 26 additions and 3 deletions

View File

@ -2,8 +2,11 @@
#include "ACCStream.h" #include "ACCStream.h"
template <class T> template <class T>
ACCStream<T>::ACCStream(const unsigned int ARRAY_SIZE, T *a, T *b, T *c) ACCStream<T>::ACCStream(const unsigned int ARRAY_SIZE, T *a, T *b, T *c, int device)
{ {
acc_set_device_num(device, acc_device_nvidia);
array_size = ARRAY_SIZE; array_size = ARRAY_SIZE;
// Set up data region on device // Set up data region on device
@ -106,8 +109,28 @@ void ACCStream<T>::triad()
void listDevices(void) void listDevices(void)
{ {
// Get number of devices // Get number of devices
int count = acc_get_num_devices(acc_device_nvidia);
// Print device list
if (count == 0)
{
std::cerr << "No devices found." << std::endl;
}
else
{
std::cout << "There are " << count << " devices." << std::endl;
}
} }
std::string getDeviceName(const int)
{
return std::string("Device name unavailable");
}
std::string getDeviceDriver(const int)
{
return std::string("Device driver unavailable");
}
template class ACCStream<float>; template class ACCStream<float>;
template class ACCStream<double>; template class ACCStream<double>;

View File

@ -22,7 +22,7 @@ class ACCStream : public Stream<T>
T *c; T *c;
public: public:
ACCStream(const unsigned int, T*, T*, T*); ACCStream(const unsigned int, T*, T*, T*, int);
~ACCStream(); ~ACCStream();
virtual void copy() override; virtual void copy() override;

View File

@ -86,7 +86,7 @@ void run()
#elif defined(ACC) #elif defined(ACC)
// Use the OpenACC implementation // Use the OpenACC implementation
stream = new ACCStream<T>(ARRAY_SIZE, a.data(), b.data(), c.data()); stream = new ACCStream<T>(ARRAY_SIZE, a.data(), b.data(), c.data(), deviceIndex);
#elif defined(SYCL) #elif defined(SYCL)
// Use the SYCL implementation // Use the SYCL implementation