Я заинтересован в портировании кода, который я написал, используя в основном библиотеку Thrust GPU для многоядерных процессоров. К счастью, the website говорит, что код тяги может использоваться с потоковыми средами, такими как OpenMP/Intel TBB.Использование тяги с openmp: не получено существенной скорости
Я написал простой код для сортировки большого массива, чтобы увидеть ускорение, используя машину, которая может поддерживать до 16 открытых потоков MP.
Таймингов, полученные на этой машине для сортировки случайного массива размера 16 миллионов являются
СТЛ: 1,47 сек
Упорные (16 нитей): 1.21 с
Там, кажется, едва ли Скорость- вверх. Я хотел бы знать, как добиться существенного ускорения сортировки массивов с помощью OpenMP, как и с графическими процессорами.
Код ниже (файл sort.cu). Компиляция была выполнена следующим образом:
NVCC -O2 -o рода sort.cu -Xcompiler -fopenmp -DTHRUST_DEVICE_SYSTEM = THRUST_DEVICE_BACKEND_OMP -lgomp
Версия NVCC 5.5 библиотека версия Thrust используется в v1. 7,0
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <ctime>
#include <time.h>
#include "thrust/sort.h"
int main(int argc, char *argv[])
{
int N = 16000000;
double* myarr = new double[N];
for (int i = 0; i < N; ++i)
{
myarr[i] = (1.0*rand())/RAND_MAX;
}
std::cout << "-------------\n";
clock_t start,stop;
start=clock();
std::sort(myarr,myarr+N);
stop=clock();
std::cout << "Time taken for sorting the array with STL is " << (stop-start)/(double)CLOCKS_PER_SEC;
//--------------------------------------------
srand(1);
for (int i = 0; i < N; ++i)
{
myarr[i] = (1.0*rand())/RAND_MAX;
//std::cout << myarr[i] << std::endl;
}
start=clock();
thrust::sort(myarr,myarr+N);
stop=clock();
std::cout << "------------------\n";
std::cout << "Time taken for sorting the array with Thrust is " << (stop-start)/(double)CLOCKS_PER_SEC;
return 0;
}
Не используйте clock(), используйте 'omp_get_wtime()'. Сортировка - это то, что я имел в виду, но поскольку это «nlog (n)», я предполагаю, что операция связана с пропускной способностью полосы пропускания и поэтому не может много выиграть от нескольких быстрых ядер. Ситуация на графическом процессоре (или XeonPhi) отличается от того, что соотношение между «основной» скоростью и скоростью памяти намного ниже. –