|
1 | 1 | package cu
|
2 | 2 |
|
3 |
| -import "testing" |
| 3 | +import ( |
| 4 | + "testing" |
| 5 | + "unsafe" |
| 6 | +) |
4 | 7 |
|
5 | 8 | func TestAttributes(t *testing.T) {
|
6 | 9 | devices, _ := NumDevices()
|
@@ -40,3 +43,82 @@ func TestAttributes(t *testing.T) {
|
40 | 43 | t.Errorf("Expected ComputeCapabilityMinor to be %v. Got %v instead", min, attrs[2])
|
41 | 44 | }
|
42 | 45 | }
|
| 46 | + |
| 47 | +func TestLaunchAndSync(t *testing.T) { |
| 48 | + devices, _ := NumDevices() |
| 49 | + |
| 50 | + if devices == 0 { |
| 51 | + return |
| 52 | + } |
| 53 | + |
| 54 | + var err error |
| 55 | + var ctx Context |
| 56 | + var mod Module |
| 57 | + var fn Function |
| 58 | + |
| 59 | + d := Device(0) |
| 60 | + if ctx, err = d.MakeContext(SchedAuto); err != nil { |
| 61 | + t.Fatal(err) |
| 62 | + } |
| 63 | + |
| 64 | + a := make([]float32, 1000) |
| 65 | + b := make([]float32, 1000) |
| 66 | + for i := range b { |
| 67 | + a[i] = 1 |
| 68 | + b[i] = 1 |
| 69 | + } |
| 70 | + |
| 71 | + size := int64(len(a) * 4) |
| 72 | + |
| 73 | + var memA, memB DevicePtr |
| 74 | + if memA, err = MemAlloc(size); err != nil { |
| 75 | + t.Fatalf("Failed to allocate for a: %v", err) |
| 76 | + } |
| 77 | + if memB, err = MemAlloc(size); err != nil { |
| 78 | + t.Fatalf("Failed to allocate for b: %v", err) |
| 79 | + } |
| 80 | + |
| 81 | + if err = MemcpyHtoD(memA, unsafe.Pointer(&a[0]), size); err != nil { |
| 82 | + t.Fatalf("Failed to copy memory from a: %v", err) |
| 83 | + } |
| 84 | + |
| 85 | + if err = MemcpyHtoD(memB, unsafe.Pointer(&b[0]), size); err != nil { |
| 86 | + t.Fatalf("Failed to copy memory from b: %v", err) |
| 87 | + } |
| 88 | + |
| 89 | + if mod, err = LoadData(add32PTX); err != nil { |
| 90 | + t.Fatalf("Cannot load add32: %v", err) |
| 91 | + } |
| 92 | + |
| 93 | + if fn, err = mod.Function("add32"); err != nil { |
| 94 | + t.Fatalf("Cannot get add32(): %v", err) |
| 95 | + } |
| 96 | + |
| 97 | + args := []unsafe.Pointer{ |
| 98 | + unsafe.Pointer(&memA), |
| 99 | + unsafe.Pointer(&memB), |
| 100 | + unsafe.Pointer(&size), |
| 101 | + } |
| 102 | + |
| 103 | + if err = fn.LaunchAndSync(1, 1, 1, len(a), 1, 1, 1, Stream(0), args); err != nil { |
| 104 | + t.Error("Launch and Sync Failed: %v", err) |
| 105 | + } |
| 106 | + |
| 107 | + if err = MemcpyDtoH(unsafe.Pointer(&a[0]), memA, size); err != nil { |
| 108 | + t.Fatalf("Failed to copy memory to a: %v", err) |
| 109 | + } |
| 110 | + |
| 111 | + if err = MemcpyDtoH(unsafe.Pointer(&b[0]), memA, size); err != nil { |
| 112 | + t.Fatalf("Failed to copy memory to b: %v", err) |
| 113 | + } |
| 114 | + |
| 115 | + for _, v := range a { |
| 116 | + if v != float32(2) { |
| 117 | + t.Error("Expected all values to be 2.") |
| 118 | + break |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + Unload(mod) |
| 123 | + DestroyContext(&ctx) |
| 124 | +} |
0 commit comments