项目作者: hassansalehe

项目描述 :
As OpenMP source-to-source translator, Clanomp takes your OpenMP program and outputs version of it with OpenMP pragmas replaced with runtime function calls.
高级语言: C
项目地址: git://github.com/hassansalehe/Clanomp.git
创建时间: 2017-11-02T07:47:30Z
项目社区:https://github.com/hassansalehe/Clanomp

开源协议:BSD 3-Clause "New" or "Revised" License

下载


Clanomp

As OpenMP source-to-source translator, Clanomp (pronounced <c-lan-omp>) takes your OpenMP program and outputs version of the program without OpenMP pragmas. The OpenMP pragmas are replaced with runtime function calls.

Goal

The goal is to see how OpenMP program is transformed after OpenMP pragmas are replaced with runtime calls.

Usage

  1. ~$ clanomp --help
  2. Usage:
  3. 1. $ clanomp <openmp_file>
  4. e.g. clanomp src/tests/parallel.c
  5. 2. $ clanomp --tests
  6. to compile all tests in src/tests folder
  7. 3. $ clanomp --help
  8. to get this help message

Sample output

  1. ~$ clanomp src/tests/single.c
  2. Translating src/tests/single.c
  3. main
  4. 0: %1 = alloca i32, align 4
  5. 0: %2 = alloca i32, align 4
  6. 0: %3 = alloca %ident_t, align 8
  7. 0: %4 = bitcast %ident_t* %3 to i8*
  8. 0: %5 = bitcast %ident_t* @0 to i8*
  9. 0: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %4, i8* %5, i64 24, i32 8, i1 false)
  10. 0: store i32 0, i32* %1, align 4
  11. 60: int count = 0;
  12. call void @llvm.dbg.declare(metadata i32* %2, metadata !10, metadata !11), !dbg !12
  13. store i32 0, i32* %2, align 4, !dbg !12
  14. 61: #pragma omp parallel shared(count)
  15. %6 = getelementptr inbounds %ident_t, %ident_t* %3, i32 0, i32 4, !dbg !13
  16. store i8* getelementptr inbounds ([33 x i8], [33 x i8]* @2, i32 0, i32 0), i8** %6, align 8, !dbg !13
  17. call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%ident_t* %3, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* %2), !dbg !13
  18. 69: printf("Value of count: %d, construct: <single>\n", count);
  19. %7 = load i32, i32* %2, align 4, !dbg !14
  20. %8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.1, i32 0, i32 0), i32 %7), !dbg !15
  21. 70: return 0;
  22. ret i32 0, !dbg !16
  23. .omp_outlined.
  24. 0: %4 = alloca i32*, align 8
  25. 0: %5 = alloca i32*, align 8
  26. 0: %6 = alloca i32*, align 8
  27. 0: %7 = alloca %ident_t, align 8
  28. 0: %8 = bitcast %ident_t* %7 to i8*
  29. 0: %9 = bitcast %ident_t* @0 to i8*
  30. 0: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %8, i8* %9, i64 24, i32 8, i1 false)
  31. 0: store i32* %0, i32** %4, align 8
  32. 0: call void @llvm.dbg.declare(metadata i32** %4, metadata !24, metadata !11), !dbg !25
  33. 0: store i32* %1, i32** %5, align 8
  34. 0: call void @llvm.dbg.declare(metadata i32** %5, metadata !26, metadata !11), !dbg !25
  35. 0: store i32* %2, i32** %6, align 8
  36. 0: call void @llvm.dbg.declare(metadata i32** %6, metadata !27, metadata !11), !dbg !25
  37. 62: {
  38. %10 = load i32*, i32** %6, align 8, !dbg !19
  39. 63: #pragma omp single
  40. %11 = getelementptr inbounds %ident_t, %ident_t* %7, i32 0, i32 4, !dbg !20
  41. store i8* getelementptr inbounds ([33 x i8], [33 x i8]* @1, i32 0, i32 0), i8** %11, align 8, !dbg !20
  42. %12 = load i32*, i32** %4, align 8, !dbg !20
  43. %13 = load i32, i32* %12, align 4, !dbg !20
  44. %14 = call i32 @__kmpc_single(%ident_t* %7, i32 %13), !dbg !20
  45. %15 = icmp ne i32 %14, 0, !dbg !20
  46. br i1 %15, label %16, label %19, !dbg !20
  47. 65: count++;
  48. %17 = load i32, i32* %10, align 4, !dbg !22
  49. %18 = add nsw i32 %17, 1, !dbg !22
  50. store i32 %18, i32* %10, align 4, !dbg !22
  51. 66: }
  52. call void @__kmpc_end_single(%ident_t* %7, i32 %13), !dbg !25
  53. br label %19, !dbg !25
  54. 63: #pragma omp single
  55. %20 = getelementptr inbounds %ident_t, %ident_t* %7, i32 0, i32 4, !dbg !26
  56. store i8* getelementptr inbounds ([33 x i8], [33 x i8]* @1, i32 0, i32 0), i8** %20, align 8, !dbg !26
  57. call void @__kmpc_barrier(%ident_t* %7, i32 %13), !dbg !26
  58. 67: }
  59. ret void, !dbg !27
  60. Value of count: 1, construct: <single>