-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[libomptarget] Implement pointer lookup as 5.1 spec.
As described in 5.1 spec 2.21.7.2 Pointer Initialization for Device Data Environments Reviewed By: RaviNarayanaswamy Differential Revision: https://reviews.llvm.org/D123093
- Loading branch information
Showing
3 changed files
with
146 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
58 changes: 58 additions & 0 deletions
58
openmp/libomptarget/test/mapping/array_section_implicit_capture.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
// RUN: %libomptarget-compile-generic -fopenmp-version=51 | ||
// RUN: %libomptarget-run-generic 2>&1 \ | ||
// RUN: | %fcheck-generic | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
|
||
#define N 1024 | ||
#define FROM 64 | ||
#define LENGTH 128 | ||
|
||
int main() { | ||
float *A = (float *)malloc(N * sizeof(float)); | ||
float *B = (float *)malloc(N * sizeof(float)); | ||
float *C = (float *)malloc(N * sizeof(float)); | ||
|
||
for (int i = 0; i < N; i++) { | ||
C[i] = 0.0; | ||
} | ||
|
||
for (int i = 0; i < N; i++) { | ||
A[i] = i; | ||
B[i] = 2 * i; | ||
} | ||
|
||
#pragma omp target enter data map(to : A [FROM:LENGTH], B [FROM:LENGTH]) | ||
#pragma omp target enter data map(alloc : C [FROM:LENGTH]) | ||
|
||
// A, B and C have been mapped starting at index FROM, but inside the kernel | ||
// they are captured implicitly so the library must look them up using their | ||
// base address. | ||
#pragma omp target | ||
{ | ||
for (int i = FROM; i < FROM + LENGTH; i++) { | ||
C[i] = A[i] + B[i]; | ||
} | ||
} | ||
|
||
#pragma omp target exit data map(from : C [FROM:LENGTH]) | ||
#pragma omp target exit data map(delete : A [FROM:LENGTH], B [FROM:LENGTH]) | ||
|
||
int errors = 0; | ||
for (int i = FROM; i < FROM + LENGTH; i++) | ||
if (C[i] != A[i] + B[i]) | ||
++errors; | ||
|
||
// CHECK: Success | ||
if (errors) | ||
fprintf(stderr, "Failure\n"); | ||
else | ||
fprintf(stderr, "Success\n"); | ||
|
||
free(A); | ||
free(B); | ||
free(C); | ||
|
||
return 0; | ||
} |
35 changes: 35 additions & 0 deletions
35
openmp/libomptarget/test/mapping/array_section_use_device_ptr.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
// RUN: %libomptarget-compile-generic -fopenmp-version=51 | ||
// RUN: %libomptarget-run-generic 2>&1 \ | ||
// RUN: | %fcheck-generic | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
|
||
#define N 1024 | ||
#define FROM 64 | ||
#define LENGTH 128 | ||
|
||
int main() { | ||
float *A = (float *)malloc(N * sizeof(float)); | ||
|
||
#pragma omp target enter data map(to : A [FROM:LENGTH]) | ||
|
||
// A, has been mapped starting at index FROM, but inside the use_device_ptr | ||
// clause it is captured by base so the library must look it up using the | ||
// base address. | ||
|
||
float *A_dev = NULL; | ||
#pragma omp target data use_device_ptr(A) | ||
{ A_dev = A; } | ||
#pragma omp target exit data map(delete : A [FROM:LENGTH]) | ||
|
||
// CHECK: Success | ||
if (A_dev == NULL || A_dev == A) | ||
fprintf(stderr, "Failure\n"); | ||
else | ||
fprintf(stderr, "Success\n"); | ||
|
||
free(A); | ||
|
||
return 0; | ||
} |