У меня есть простая задача, которую я не могу решить.Я получил 2 одномерных массива (называемых векторами), состоящих из 10 элементов.Каждый элемент массива содержит случайное положительное число.Цель состоит в том, чтобы использовать CUDA для вычисления суммы этих двух массивов каждого номера индекса (другими словами: Vector Sum [0] = Vector A [0] + Vector B [0], затем то же самое с 1,2 ...10)
Вот мой код (kernel.cu).Я знаю, что использую имена переменных с плавающей точкой для целочисленных типов данных.Это потому, что я изначально планировал сделать это для типов данных с плавающей запятой, но я не смог заставить проект работать вообще из-за несовместимости типов данных.Поправьте меня, если это возможно, используя для этого типы данных с плавающей запятой.
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>
__global__ void vecAdd_kernel(int *floatAr1gpu, int *floatAr2gpu, int *floatSumGPU, int The_N){
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < The_N) floatSumGPU[i] = floatAr1gpu[i] + floatAr2gpu[i];
}
int main()
{
const unsigned int arraySize = 10;
int floatArray1[arraySize];
int floatArray2[arraySize];
int *floatAr1gpu = 0;
int *floatAr2gpu = 0;
int floatSum[arraySize];
int *floatSumGPU = 0;
for (int c = 0; c < arraySize; c++) {
floatArray1[c] = (rand() % 10)+1;
floatArray2[c] = (rand() % 10)+1;
}
//Put the data into the GPU now
// V--- This is allocating GPU memory under that name and Variable
cudaMalloc((void **)&floatArray1, sizeof(float)*arraySize);
cudaMalloc((void **)&floatArray2, sizeof(float)*arraySize);
cudaMalloc((void **)&floatSum, sizeof(float)*arraySize);
// CPU Memory GPU Mem Array size Method
cudaMemcpy(floatArray1, floatAr1gpu, sizeof(float)*arraySize, cudaMemcpyHostToDevice);
cudaMemcpy(floatArray2, floatAr2gpu, sizeof(float)*arraySize, cudaMemcpyHostToDevice);
// execute
// grid size, block size
vecAdd_kernel << < 1, arraySize >> > (floatArray1, floatArray2, floatSum, arraySize);
//Copy data back from GPU to RAM
// GPU Memory CPU Mem Array size Method
cudaMemcpy(floatSumGPU, floatSum, sizeof(float)*arraySize, cudaMemcpyDeviceToHost);
// clean up
cudaFree(floatArray1);
cudaFree(floatArray2);
cudaFree(floatSum);
for (int cc = 0; cc < arraySize; cc++) {
std::cout << "Result of array number " << cc << " = " << floatSum[cc] << std::endl;
}
std::cout << "Done. Press any key to exit." << std::endl;
char key = std::cin.get();
return 0;
}
Вот что я получаю в результате: Результат программы
Это то, что я хочудля достижения (используя CUDA): Результат программы
Что не так с кодом?Я установил точку останова для проверки этого массива здесь: содержимое массива