void shrd_ofld11(void) { // Malloc shared memory using compiler intrinsic #ifdef __INTEL_OFFLOAD ptr = (_Cilk_shared int *) _Offload_shared_malloc(4); #else ptr = (int *) malloc(4); #endif // Initialize shared memory _Cilk_offload init11(); // Check results if (*ptr == 9) printf("PASS shrd_ofld11\n"); else printf("*** FAIL shrd_ofld11\n"); // Free shared memory #ifdef __INTEL_OFFLOAD _Offload_shared_free(ptr); #else free(ptr); #endif }
extern "C" void __intel_cilk_for_64_offload( int size, void (*copy_constructor)(void*, void*), int target_number, void *raddr, void *closure_object, uint64_t iters, uint64_t grain_size) { OFFLOAD_DEBUG_TRACE(3, "%s\n", __func__); target_number = __offload_myoIsAvailable(target_number); if (target_number >= 0) { struct S { void *M1; uint64_t M2; uint64_t M3; char closure[]; } *args; args = (struct S*) _Offload_shared_malloc(sizeof(struct S) + size); if (args == NULL) LIBOFFLOAD_ERROR(c_malloc); args->M1 = raddr; args->M2 = iters; args->M3 = grain_size; if (copy_constructor == 0) { memcpy(args->closure, closure_object, size); } else { copy_constructor(args->closure, closure_object); } myo_wrapper.Release(); myo_wrapper.GetResult( myo_wrapper.RemoteCall("__intel_cilk_for_64_offload", args, target_number) ); myo_wrapper.Acquire(); _Offload_shared_free(args); ORSL::release(target_number); } else { __cilkrts_cilk_for_64(raddr, closure_object, iters, grain_size); } }
// 在mic上执行下面函数会报错 // CARD--ERROR:1 thread:3 myoArenaFree: It is not supported to free shared memory from the MIC side! _Cilk_shared void cilk_sharedfree() { int i; share_pointer = (int *)_Offload_shared_malloc(sizeof(int) * n); for(i = 0; i < n; i++) { share_pointer[i] = i; } for(i = 0; i < n; i++) { printf("cilk_sharedfree: share_pointer[%d] is %d\n", i, share_pointer[i]); } _Offload_shared_free(share_pointer); }
int main() { //_Cilk_offload cilk_malloc(); //_Cilk_offload cilk_sharedfree(); // 下面三条语句执行时会错误 //share_pointer =(int *) malloc(sizeof(int) * n); //_Cilk_offload cilk_pointer(); //free(share_pointer); // 下面三条语句可以正常执行 share_pointer = (int *) _Offload_shared_malloc(sizeof(int) * n); _Cilk_offload cilk_pointer(); _Offload_shared_free(share_pointer); return 0; }