簡體   English   中英

OpenCL多GPU集成-將全局大小從32更改為64時出現段錯誤

[英]OpenCL multiple GPU integral - segfault when changing global size from 32 to 64

我創建了內核函數,該函數計算特定范圍內的積分並將結果添加到變量(每個GPU一個變量),並且在主機中將它們全部添加,並且得到積分結果(在這種情況下為x ^ 2dx),范圍為0-8我的結果是170,666 ...是的。 我使用的全局工作大小為1、2、4、8、16、32,並且對所有工作大小都有效,但是由於某些原因,當我將GWS更改為64時,出現了分段錯誤。 我有1個平台(包含8個GPU卡),每個設備都有自己的隊列,上下文和內核。

這是我的代碼中的幾行:

我創建了3個緩沖區,稍后將它們傳遞給內核(第三個緩沖區用於讀取結果)。

cl_mem bufferA[deviceNumber];
cl_mem bufferB[deviceNumber];
cl_mem bufferC[deviceNumber];
for(int i = 0; i< deviceNumber; i++){
    bufferA[i] = clCreateBuffer(context[i], CL_MEM_READ_WRITE , sizeof(float) * global_size, NULL, &error);
    bufferB[i] = clCreateBuffer(context[i], CL_MEM_READ_ONLY , sizeof(float) * global_size, NULL, &error);
    bufferC[i] = clCreateBuffer(context[i], CL_MEM_WRITE_ONLY, sizeof(float) * global_size, NULL, &error);
}

在創建和構建程序之后,我設置了內核參數。

    for(int i = 0; i< deviceNumber; i++){
        error = clSetKernelArg(kernel[i], 0, sizeof(cl_mem), (void*)&bufferA[i]);
        error = clSetKernelArg(kernel[i], 1, sizeof(cl_mem), (void*)&bufferB[i]);
        error = clSetKernelArg(kernel[i], 2, sizeof(cl_mem), (void*)&bufferC[i]);
        error = clSetKernelArg(kernel[i], 3, sizeof(cl_int), (void*)&global_size);
}

並排隊writeBuffers

for(int i = 0; i< deviceNumber; i++){
    error = clEnqueueWriteBuffer(commandQueue[i], bufferA[i], CL_FALSE, 0, sizeof(float) * global_size, a, 0, NULL, NULL);
    error = clEnqueueWriteBuffer(commandQueue[i], bufferB[i], CL_FALSE, 0, sizeof(float) * global_size, &b[i], 0, NULL, NULL);
}

使內核排隊以完成其工作。

for(int i = 0; i< deviceNumber; i++){
    error = clEnqueueNDRangeKernel(commandQueue[i], kernel[i], 1, NULL, &global_size, &localWorkSize, 0, NULL, NULL);
}

最后是發生段錯誤的地方:

for(int i = 0; i< deviceNumber; i++){
    std::cout<<"clEnqueueReadBuffer: "<<error<<std::endl;
    error = clEnqueueReadBuffer(commandQueue[i], bufferC[i], CL_TRUE, 0, sizeof(float) * global_size, &c[i], 0, NULL, NULL);
}

我到處都打印錯誤代碼,所有錯誤代碼都為0,我在輸出中看到的最后一件事是clEnqueueReadBuffer之前的那個字符串,因此它在for循環的第一次迭代中崩潰。

有人知道我在這里想念什么嗎?

發現故障!

sizeof(float) * global_size

可以讀取大小等於global_size的向量是可以的,但是在將代碼重新偽造為整數之后,我完全忘了這一點,如果每個設備讀取一個變量,則只需要sizeof(type)。 希望對別人有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM