簡體   English   中英

CUDA,用於測試吞吐量的小程序

[英]CUDA, little program to test the throughput

我需要通過在不同場景中測試它們的吞吐量來測試一些GPU。

這包括一個簡單的64b乘法:

__device__ void add(unsigned int *data, bool flag){
unsigned int index = threadIdx.x;
unsigned int result;

asm ("{\n\t"
     "add.cc.u32    %1, %1, %1;\n\t"
     "addc.u32  %0, 0, 0;\n\t"
     "}"
     : "=r"(result), "+r"(index): );

if(flag)
    data[threadIdx.x] = result;
}

64b模數:

__device__ void mod(){
    asm ("{\n\t"
         ".reg .u64 t1;\n\t"
         "cvt.u64.u32   t1, %0;\n\t"
         "rem.u64       t1, t1, t1;\n\t" 
         "}"
         : : "r"(index));
}

和64b mul + mod:

__device__ void mulmod
    asm ("{\n\t"
         ".reg .u64 t1;\n\t"
         ".reg .u64 t2;\n\t"
         "mul.wide.u32  t1, %0, %0;\n\t"
         "cvt.u64.u32   t2, %0;\n\t"
         "rem.u64       t1, t1, t2;\n\t"
         "}"
         : : "r"(index));
}

我認為任何內存訪問對我的意圖都是完全無用的,我想使用線程索引變量作為輸入。

因為我要寫無寄存器,所以我不需要關心寄存器的使用情況,我可以啟動盡可能多的線程(每個GPU都允許)

我想知道:

  • 如果這是正確的方法

  • 是否有任何特定的線程配置,除了最大化線程數,我可以檢索最佳吞吐量?

你的第一個“子問題”的答案是不是這不是正確的方法,因為你編寫的那些函數都不會被編譯器發出。

您可以在上面鏈接的問題的答案中看到更多詳細信息,但簡短的版本是C編譯器級死代碼優化將消除任何不參與寫入內存的值的代碼。 因此,您必須讓這些函數返回一個值,並且必須使用返回值,使編譯器無法推斷出對設備函數的調用是多余的並消除它。

除此之外,每個SM必須有足夠的活動warp來分攤架構中的所有指令調度延遲,並確保測量設備函數的指令吞吐量,而不是指令調度程序和管道的延遲。

暫無
暫無

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

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