MCPcopy Create free account
hub / github.com/clMathLibraries/clBLAS / handleMAD_AND_REDUCE

Method handleMAD_AND_REDUCE

src/library/blas/gens/kprintf.cpp:773–833  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

771}
772
773void kprintf::handleMAD_AND_REDUCE(char **_src, char **_dst)
774{
775 int numCharsWritten = 0;
776 char id1[256], id2[256], id3[256];
777 char * ptr;
778 char *src = *_src;
779 char *dst = *_dst;
780 int vwidth=1;
781
782 ptr = mystrtok( src, "(,)");
783 ptr = mystrtok( NULL, "(,)"); // Get first ID
784 strcpy( id1, ptr);
785 ptr = mystrtok( NULL, "(,)"); // Get second ID
786 strcpy( id2, ptr);
787 ptr = mystrtok( NULL, "(,)"); // Get third ID
788 strcpy( id3, ptr);
789 *_src = ptr + strlen(ptr) + 1;
790 //std::cout << id1 << " " << id2 << " " << id3 << std::endl;
791 if ( (strcmp(id1, id2) == 0) || (strcmp(id1, id3)==0) || (strcmp(id2,id3) == 0) )
792 {
793 std::cout << "%MAD_AND_REDUCE( C, A, B) : C , A and B have to be UNIQUE" << std::endl;
794 throw -1;
795 }
796
797 switch(s_or_v)
798 {
799 case SCALAR:
800 //
801 // e.g. float += float4*float4
802 // We will use only the first vector component
803 //
804 if (vectorWidth == 1)
805 {
806 numCharsWritten = sprintf(dst, "%s = mad(%s,%s,%s);\n\t", id1, id2, id3, id1);
807 dst += numCharsWritten;
808
809 } else {
810 numCharsWritten = sprintf(dst, "%s = mad(%s.%s,%s.%s,%s);\n\t", id1, id2, vecIndices[0], id3,
811 vecIndices[0], id1);
812 dst += numCharsWritten;
813 }
814 break;
815
816 case VECTOR:
817 numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S0,(%s).S0,%s.S0);\n\t", id1, id2, id3, id1);
818 dst += numCharsWritten;
819 numCharsWritten = sprintf(dst, "%s.S0 = mad((%s).S1,-(%s.S1),%s.S0);\n\t", id1, id2, id3, id1);
820 dst += numCharsWritten;
821
822 numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S0,(%s).S1,%s.S1);\n\t", id1, id2, id3, id1);
823 dst += numCharsWritten;
824 numCharsWritten = sprintf(dst, "%s.S1 = mad((%s).S1,(%s.S0),%s.S1);\n\t", id1, id2, id3, id1);
825 dst += numCharsWritten;
826 break;
827
828 default:
829 std::cout << "handleMAD_AND_REDUCE: s_or_v is neither scalar nor a vector" << std::endl;
830 throw -1;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected