ความสอดคล้องของตัวชี้ฟังก์ชัน Cuda [ซ้ำกัน]

ฉันเพิ่งลองใช้ตัวชี้ฟังก์ชันเพื่อกำหนดขั้นตอนการประมวลผลต่างๆ ในแอปพลิเคชันของฉันแบบไดนามิก ซึ่งทำงานบน sm_30

การโพสต์โค้ดที่นี่อาจเป็นเรื่องยาก เนื่องจากมีไฟล์และฟังก์ชันที่แตกต่างกันมากมายที่เกี่ยวข้อง แต่โดยพื้นฐานแล้ว ฉันเริ่มจากตัวอย่างที่รวมอยู่ใน Cuda Toolkit 5.0

ฉันจัดสรรบัฟเฟอร์ฟังก์ชันอุปกรณ์โดยที่ฉันคัดลอกตัวชี้ฟังก์ชันอุปกรณ์ ซึ่งกำหนดเช่นเดียวกับในตัวอย่างด้วย cudaMemcpyfromสัญลักษณ์Async ที่ใช้กับ DeviceToDevice copy Kind

ตัวชี้อุปกรณ์ของฉันถูกกำหนดเช่นนี้ใน .cu.h :

//device function pointer model
typedef void (*func)(structGpuArgument*);

//Declaring a function
__device__ void gpuFunc1(structGpuArgument* arg1);

ที่อื่นฉันมี .cu ที่มีการประกาศก่อนหน้านี้ซึ่งมีรหัสต่อไปนี้:

//get the actual function pointer
__device__ func gpuFuncPtr = gpuFunc1;

//Buffer to store a list of function pointer
func* pFuncDevBuffer;
cudaMalloc(&pFuncDevBuffer,NB_FUNC*sizeof(func));

//copy the actual function pointer (symbol) to the list buffer 
cudaMemcpyFromSymbolAsync( pFuncDevBuffer+i ,gpuFuncPtr,sizeof(func),0,cudaMemcpyDeviceToDevice,stream)

//Launch the kernel that will use the functions
kernel_test<<<1,10,0,stream>>>(pFuncDevBuffer)
...

//defining the kernel that uses pointer buffer
__global__ void kernel_test(func* pFuncDevBuffer)
{
   printf("func address : %p\n",pFuncDevBuffer[0]);
   pFuncDevBuffer[0](NULL);
}

//defining the function pointed by the function pointer
__device__ void gpuFunc1(structGpuArgument* arg1)
{
     do_something;
}

ในความเป็นจริง ทุกอย่างทำงานได้ดีตราบใดที่เคอร์เนล ทั่วโลก ที่รับบัฟเฟอร์ฟังก์ชัน อุปกรณ์ ในอาร์กิวเมนต์ถูกกำหนดไว้ในไฟล์เดียวกับที่ฟังก์ชันและตัวชี้ของฟังก์ชัน เคอร์เนลสามารถพิมพ์ที่อยู่ของฟังก์ชัน (0x4) และรันโค้ดได้โดยไม่มีปัญหา ฉันไม่ได้ใช้การคอมไพล์แยกต่างหาก

เมื่อในอินสแตนซ์เดียวกันของโปรแกรมเคอร์เนลตัวที่สองที่กำหนดไว้ที่อื่นใช้บัฟเฟอร์ตัวชี้ฟังก์ชันเดียวกันในอาร์กิวเมนต์ เคอร์เนลสามารถพิมพ์ที่อยู่หน่วยความจำเดียวกันสำหรับตัวชี้ฟังก์ชัน (0x4) แต่ถ้าพยายามดำเนินการ ล้มเหลวในการออกคำสั่งที่ผิดกฎหมายที่ 0x00000000 ใน cuda-memcheck การเรียก cuda API อื่น ๆ หยุดค้างหลังจากนั้น ฉันต้องรีบูทคอมพิวเตอร์ของฉัน (ไม่รองรับการรีเซ็ตผ่าน cuda-smi บน GPU ของฉัน)

ฉันต้องการทราบว่ามีปัญหาที่ทราบในการใช้ตัวชี้ฟังก์ชันด้วยวิธีนี้หรือไม่ เช่น โดยใช้บัฟเฟอร์ตัวชี้ฟังก์ชันที่กำหนดไว้ในไฟล์อื่น แต่ใช้คำจำกัดความของตัวชี้ฟังก์ชันเดียวกันร่วมกัน

นอกจากนี้ หากมีการออกกำลังกายเพื่อรีเซ็ตอุปกรณ์หลังจาก segfault โดยไม่ต้องรีบูตทั้งระบบ อาจช่วยให้ฉันประหยัดเวลาในขณะที่แก้ไขข้อบกพร่องแอปพลิเคชันของฉันได้

ขอขอบคุณสำหรับความช่วยเหลือของคุณ


person Tobbey    schedule 07.05.2013    source แหล่งที่มา
comment
คุณกำลังเชื่อมโยงรหัสอุปกรณ์เป็น 2 ไฟล์แยกกัน คุณต้องใช้ตัวเชื่อมโยงอุปกรณ์   -  person Robert Crovella    schedule 07.05.2013
comment
@RobertCrovella ขอบคุณสำหรับคำตอบของคุณ แต่คุณช่วยเจาะจงกว่านี้ได้ไหม? เนื่องจากฉันไม่มีข้อผิดพลาดในการลิงก์ในตอนนี้ และฉันใช้ CUDA.Cmake เพื่อสร้างโปรเจ็กต์ของฉัน ซึ่งซ่อนฉันเป็นส่วนหนึ่งของกระบวนการคอมไพล์/ลิงก์ เท่าที่ฉันรู้ ไม่มีหน่วยความจำที่จำกัดกระบวนการใน nvidia GPU ดังนั้นเหตุใดเคอร์เนลของฉันจึงไม่สามารถเข้าถึงและโหลดโค้ดจากที่อยู่ที่อ่านจากบัฟเฟอร์ (0x4)   -  person Tobbey    schedule 07.05.2013
comment
หลังจากได้จำลองปัญหาตามตัวอย่างง่ายๆ แล้ว ดูเหมือนว่าคุณจะคิดถูก ในเชิงลึก ฉันได้สร้างเวอร์ชันที่ล้มเหลวซึ่งคอมไพล์ในโหมดโปรแกรมทั้งหมดและเป็นเวอร์ชันที่ประสบความสำเร็จโดยไม่ต้องเขียนโค้ดใหม่ใดๆ ยกเว้นการตั้งค่าตัวเลือกการคอมไพล์แยกต่างหาก ปัญหาของฉันตอนนี้คือประการแรกฉันไม่เข้าใจเอกสารประกอบของ nvcc รหัสอุปกรณ์ที่ย้ายตำแหน่งได้จริงและการคอมไพล์แบบแยกส่วนมีไว้เพื่ออะไร และเกี่ยวข้องกับปัญหาของฉันอย่างไร ในอีกด้านหนึ่ง ในขณะที่พยายามใช้การคอมไพล์แยกกันและโค้ดอุปกรณ์ที่ย้ายตำแหน่งได้บน cuda.cmake ฉันได้รับข้อผิดพลาดในการเชื่อมโยงการอ้างอิงที่ไม่ได้กำหนดมากมาย   -  person Tobbey    schedule 07.05.2013
comment
ขออภัย ฉันอยู่บนเครื่องบิน ดูเหมือนว่าคุณกำลังคิดออก หากคุณมีรหัสอุปกรณ์ใน 2 ไฟล์ที่ต้องเรียกหรืออ้างอิงถึงกัน คุณต้องใช้ตัวเชื่อมโยงอุปกรณ์ (ซึ่งใช้เมื่อคุณเลือกการคอมไพล์แยกกัน) คุณอาจต้องการอ่านส่วนนั้นของคู่มือ nvcc ที่ docs.nvidia.com ขออภัย ฉันไม่สามารถช่วย cmake ได้   -  person Robert Crovella    schedule 07.05.2013