yum-mirror/VkFFT
git clone https://git.yummers.dev/yum-mirror/VkFFT
d6f7ded
master
1//general parts 2#include <stdio.h> 3#include <vector> 4#include <memory> 5#include <string.h> 6#include <chrono> 7#include <thread> 8#include <iostream> 9#ifndef __STDC_FORMAT_MACROS 10#define __STDC_FORMAT_MACROS 11#endif 12#include <inttypes.h> 13 14//CUDA parts 15#include "cuda_runtime.h" 16#include "device_launch_parameters.h" 17#include <cufft.h> 18#include <cuda_fp16.h> 19#include <cufftXt.h> 20 21void launch_precision_cuFFT_half(void* inputC, void* output_cuFFT, int device_id, uint64_t* dims) 22{ 23 cudaSetDevice(device_id); 24 cufftHandle planHalf; 25 half2* dataC; 26 cudaMalloc((void**)&dataC, sizeof(half2) * dims[0] * dims[1] * dims[2]); 27 cudaMemcpy(dataC, inputC, sizeof(half2) * dims[0] * dims[1] * dims[2], cudaMemcpyHostToDevice); 28 if (cudaGetLastError() != cudaSuccess) { 29 fprintf(stderr, "Cuda error: Failed to allocate\n"); 30 return; 31 } 32 uint64_t sizeCUDA; 33 cufftResult res = cufftCreate(&planHalf); 34 size_t ws = 0; 35 long long local_dims[3]; 36 switch (dims[4]) { 37 case 1: 38 local_dims[0] = (long long)dims[0]; 39 local_dims[1] = (long long)dims[1]; 40 local_dims[2] = (long long)dims[2]; 41 break; 42 case 2: 43 local_dims[0] = (long long)dims[1]; 44 local_dims[1] = (long long)dims[0]; 45 local_dims[2] = (long long)dims[2]; 46 break; 47 case 3: 48 local_dims[0] = (long long)dims[2]; 49 local_dims[1] = (long long)dims[1]; 50 local_dims[2] = (long long)dims[0]; 51 break; 52 } 53 res = cufftXtMakePlanMany( 54 planHalf, dims[4], local_dims, NULL, 1, 1, CUDA_C_16F, 55 NULL, 1, 1, CUDA_C_16F, 1, &ws, CUDA_C_16F); 56 57 for (int i = 0; i < 1; i++) { 58 res = cufftXtExec(planHalf, dataC, dataC, -1); 59 } 60 cudaDeviceSynchronize(); 61 cudaMemcpy(output_cuFFT, dataC, sizeof(half2) * dims[0] * dims[1] * dims[2], cudaMemcpyDeviceToHost); 62 cudaDeviceSynchronize(); 63 cufftDestroy(planHalf); 64 cudaFree(dataC); 65}