Технология CUDO сложить два массива - ошибка c++

В универе задали написать программу сложения двух массивов с использованием CUDA технологии на c++ а также заюзать функции синхронизации потоков CUDA, я вообще в первый раз услышал об этой технологии и не представляю как с ней работать, но скопипастил кусок кода, который, вроде как, выполняет нужное мне действие. Что конкретно происходит понять не могу, но оно не компилируется - пишет что E1696 cannot open source file "cutil.h". И не видит функции видимо этого инклюдника, такие как E0020 identifier "__syncthreads" is undefined или E0020 identifier "cutCreateTimer" is undefined. Вот код

#include <stdio.h>
#include <conio.h>
#include <cmath>
#include <cutil.h>
#include <cuda_runtime_api.h>
#include <algorithm>
#include "device_launch_parameters.h"
using namespace std;
#pragma comment(lib, "cutil32D.lib")
int rint(int l, int h)
{
int r = h - l + 1, res;
res = rand() % r + l;
return res;
}

int* rintarr(int size, int l, int h)
{
int* res = new int[size];//, t;
for (int i = 0; i <= size - 1; i++)
{
    //t = rint(0, size);
    res[i] = size - i;//rint(l+t*h, h+t*h);
}
return res;
}

void iaprint(int* arr, int size)
{
for (int i = 0; i <= size - 1; i++)
    printf("%i ", arr[i]);
printf("\n");
}

//Выводим информацию об устройствах
cudaDeviceProp* ShowDeviceInfo()
{
int deviceCount;
cudaDeviceProp deviceProp;

//Получаем и выводим количество устройств
cudaGetDeviceCount(&deviceCount);
printf("Device count: %d\n\n", deviceCount);

for (int i = 0; i <= deviceCount - 1; i++)
{
    //Получаем информацию о текущем устройстве
    cudaGetDeviceProperties(&deviceProp, i);

    //Выводим иформацию об устройстве
    printf("Device name: %s\n", deviceProp.name);
    printf("Total global memory: %d\n", deviceProp.totalGlobalMem);
    printf("Shared memory per block: %d\n", deviceProp.sharedMemPerBlock);
    printf("Registers per block: %d\n", deviceProp.regsPerBlock);
    printf("Warp size: %d\n", deviceProp.warpSize);
    printf("Memory pitch: %d\n", deviceProp.memPitch);
    printf("Max threads per block: %d\n", deviceProp.maxThreadsPerBlock);
    printf("Max threads dimensions: x = %d, y = %d, z = %d\n", deviceProp.maxThreadsDim[0], 
deviceProp.maxThreadsDim[1], deviceProp.maxThreadsDim[2]);
    printf("Max grid size: x = %d, y = %d, z = %d\n", deviceProp.maxGridSize[0],             
deviceProp.maxGridSize[1], deviceProp.maxGridSize[2]);
    printf("Clock rate: %d\n", deviceProp.clockRate);
    printf("Total constant memory: %d\n", deviceProp.totalConstMem);
    printf("Compute capability: %d.%d\n", deviceProp.major, deviceProp.minor);
    printf("Texture alignment: %d\n", deviceProp.textureAlignment);
    printf("Device overlap: %d\n", deviceProp.deviceOverlap);
    printf("Multiprocessor count: %d\n", deviceProp.multiProcessorCount);
    printf("Kernel execution timeout enabled: %s\n", deviceProp.kernelExecTimeoutEnabled ? "true" :                 
"false");
}

return &deviceProp;
}

//Спецификаторы вызова: global - GPU из CPU; device - GPU из GPU; host - CPU из CPU
//Использован один блок
__global__ void vadd(float* v1, float* v2, float* v3)
{
int cur = threadIdx.x; //Получение нномера текущей нити
v3[cur] = v1[cur] + v2[cur];
}

__global__ void sort(int* arr, int size)
{
int i = threadIdx.x;
int k = 0, b = arr[i];
for (int j = 0; j <= size - 1; j++)
    if (arr[j] < b) k++;
__syncthreads();
arr[k] = b;
}

int main()
{
/*--------------------vadd---------------------*/
unsigned int t1;
cutCreateTimer(&t1);
cutResetTimer(t1);
cudaSetDevice(0);

cudaDeviceProp* deviceProp = ShowDeviceInfo();

int size = deviceProp->maxThreadsPerBlock;
float* v1 = new float[size];
float* v2 = new float[size];
float* v3 = new float[size];
for (int i = 0; i <= size - 1; i++)
{
    v1[i] = (float)i / 10 + (float)i;
    v2[i] = (float)i / 5 + (float)2 * i;
}

float* cv1, * cv2, * cv3;
cudaMalloc((void**)&cv1, size * sizeof(float));
cudaMalloc((void**)&cv2, size * sizeof(float));
cudaMalloc((void**)&cv3, size * sizeof(float));
cudaMemcpy(cv1, v1, size * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(cv2, v2, size * sizeof(float), cudaMemcpyHostToDevice);

dim3 gridSize = dim3(1, 1, 1); //Используем только один блок
dim3 blockSize = dim3(size, 1, 1); //Используем size нитей
//Событие окончания сложения
cudaEvent_t event;
cudaEventCreate(&event);
cudaEventRecord(event, 0); //0 - номер основного потока
cutStartTimer(t1);
vadd << <gridSize, blockSize >> > (cv1, cv2, cv3); //Складываем вектора (асинхронно)
cudaEventSynchronize(event); //Ожидание окончания работы всех нитей GPU
cutStopTimer(t1);

cudaMemcpy(v3, cv3, size * sizeof(float), cudaMemcpyDeviceToHost);
/*for (int i = 0; i <= size - 1; i++)
{
    printf("%.2f + %.2f = %.2f\n", v1[i], v2[i], v3[i]);
}*/
printf("\nGPU vadd: %f ms\n\n", cutGetTimerValue(t1));

cudaEventDestroy(event);
cudaFree(cv1); cudaFree(cv2); cudaFree(cv3);
delete[] v1; delete[] v2; delete[] v3;
getch();
/*---------------------------------------------*/

/*--------------------sort---------------------*/
srand(0);
int s = 100;
int* arr = rintarr(s, 0, 5);
iaprint(arr, s);
printf("\n");

int* carr;
cudaMalloc((void**)&carr, s * sizeof(int));
cudaEvent_t e;
cudaEventCreate(&e);
cudaEventRecord(e, 0);
cutStartTimer(t1);
cudaMemcpy(carr, arr, s * sizeof(int), cudaMemcpyHostToDevice);
sort <<<1, s >>> (carr, s);
cudaEventSynchronize(e);
cutStopTimer(t1);

cudaEventDestroy(e);
int* brr = new int[s];
cudaMemcpy(brr, carr, s * sizeof(int), cudaMemcpyDeviceToHost);
iaprint(brr, s);
printf("GPU vadd: %f ms\n\n", cutGetTimerValue(t1));

cutStartTimer(t1);
sort(arr, arr + s);
iaprint(arr, s);
cutStopTimer(t1);
printf("CPU vadd: %f ms\n\n", cutGetTimerValue(t1));

cudaFree(carr);
delete[] arr;
delete[] brr;
getch();
/*---------------------------------------------*/
return 0;

}

Nvidia toolkit 10.2 я скачал, как я понимаю он в себя все сам должен включать и никаких проблем быть не должно. Если кто-то может объяснить с чего вообще надо начинать изучать эту тему, буду признантелен, но главное, скажите что сделать чтобы проект скомпилился


Ответы (0 шт):