mixed.cu 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <iostream>
  2. #include "file1.h"
  3. #include "file2.h"
  4. #ifdef _WIN32
  5. #define EXPORT __declspec(dllexport)
  6. #define IMPORT __declspec(dllimport)
  7. #else
  8. #define EXPORT
  9. #define IMPORT
  10. #endif
  11. result_type __device__ file1_func(int x);
  12. result_type_dynamic __device__ file2_func(int x);
  13. IMPORT void __host__ cuda_dynamic_lib_func();
  14. static __global__ void mixed_kernel(result_type* r, int x)
  15. {
  16. *r = file1_func(x);
  17. result_type_dynamic rd = file2_func(x);
  18. }
  19. EXPORT int mixed_launch_kernel(int x)
  20. {
  21. cuda_dynamic_lib_func();
  22. result_type* r;
  23. cudaError_t err = cudaMallocManaged(&r, sizeof(result_type));
  24. if (err != cudaSuccess) {
  25. std::cerr << "mixed_launch_kernel: cudaMallocManaged failed: "
  26. << cudaGetErrorString(err) << std::endl;
  27. return x;
  28. }
  29. mixed_kernel<<<1, 1>>>(r, x);
  30. err = cudaGetLastError();
  31. if (err != cudaSuccess) {
  32. std::cerr << "mixed_kernel [SYNC] failed: " << cudaGetErrorString(err)
  33. << std::endl;
  34. return x;
  35. }
  36. err = cudaDeviceSynchronize();
  37. if (err != cudaSuccess) {
  38. std::cerr << "mixed_kernel [ASYNC] failed: "
  39. << cudaGetErrorString(cudaGetLastError()) << std::endl;
  40. return x;
  41. }
  42. int result = r->sum;
  43. err = cudaFree(r);
  44. if (err != cudaSuccess) {
  45. std::cerr << "mixed_launch_kernel: cudaFree failed: "
  46. << cudaGetErrorString(err) << std::endl;
  47. return x;
  48. }
  49. return result;
  50. }