ฉันเพิ่งลองใช้ตัวชี้ฟังก์ชันเพื่อกำหนดขั้นตอนการประมวลผลต่างๆ ในแอปพลิเคชันของฉันแบบไดนามิก ซึ่งทำงานบน 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 โดยไม่ต้องรีบูตทั้งระบบ อาจช่วยให้ฉันประหยัดเวลาในขณะที่แก้ไขข้อบกพร่องแอปพลิเคชันของฉันได้
ขอขอบคุณสำหรับความช่วยเหลือของคุณ