#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cutil.h>
#if __DEVICE_EMULATION__
bool InitCUDA(void){
fprintf(stderr, "Режим эмуляции\n");
return true;
}
#else
bool InitCUDA(void) {
int deviceCount;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0) {
printf("Устройства CUDA не обнаружены\n");
return false;
}
for (int dev = 0; dev < deviceCount; dev++) {
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
if (dev == 0) {
if (deviceProp.major == 9999 && deviceProp.minor == 9999) {
printf("Устройства CUDA не обнаружены\n");
return false;
} else if (deviceCount == 1) {
printf("Найдено 1 CUDA устройство\n");
} else {
printf("Найдено %d CUDA устройств \n", deviceCount);
}
}
}
return true;
}
#endif
__global__ void calc(double *a, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
double val = a[idx];
if (idx < n){
a[idx] = 4.0 /(1.0 + val*val);
}
}
int main(int argc, char* argv[]) {
setlocale(LC_ALL, "Russian");
if(!InitCUDA()) {
system("pause");
return 0;
}
double *a_h; // указатель на область памяти хоста
double *a_d; // указатель на область памяти устройства
const int numSteps = 10000; // количество разбиений
a_h = (double *)malloc(sizeof(double)*numSteps); // выделяем память на хосте обычным способом
cudaMalloc((void **) &a_d, sizeof(double)*numSteps); // выделяем память на устройстве
int blockSize = 4;
int blocks = numSteps / blockSize + (numSteps % blockSize == 0 ? 0:1);
double left = 0.0;
double right = 1.0;
double step = (right-left)/numSteps;
int i = 0;
for (double x = left + 0.5*step; x < right; x += step) {
a_h[i] = x;
i++;
}
cudaMemcpy(a_d, a_h, sizeof(double)*numSteps, cudaMemcpyHostToDevice);
calc<<< blocks, blockSize >>> (a_d, numSteps);
cudaMemcpy(a_h, a_d, sizeof(double)*numSteps, cudaMemcpyDeviceToHost); // передаем данные обратно на хост
double sum = 0.0;
for(int i = 0; i < numSteps; i++) {
sum += a_h[i];
}
printf("Значение интеграла %0.7f\n", sum / numSteps);
system("pause");
free(a_h);
cudaFree(a_d);
return EXIT_SUCCESS;
}